⑴ C語言 socket編程 TFTP伺服器與客戶端的實現
想要快速入門socket編程,先找嵌入式linux方面的書籍來看,看關於文件操作部分,然後看基於tcp udp的socket編程實例,拿別人代碼跑一跑,就能理解了,往後想了解更多,可以往tcpip協議方面看也能往Linux網路編程方面看,對於tftp協議,基於udp來設計,只需要看看別人怎麼實現協議的代碼,然後用結構體等數據結構將協議的各個段封裝進去就行
⑵ C語言 UDP socket 簡單客戶端 編程,急
提一下,你那個地址不好用,換成了127.0.0.1,埠可以用,完全按照要求寫的,編譯沒錯誤,調試通過:
gcc server.c -o server
gcc client.c -o client
打開2個控制台:一個運行 ./server 另一個運行 ./client
server.c:
========================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#define BUFFERSIZE 1024
typedef struct sockaddr SA;
int main(void)
{
char buf[BUFFERSIZE];
struct sockaddr_in addr_s;
struct sockaddr_in addr_c;
int sockfd;
socklen_t length;
int i;
if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket fail");
return -1;
}
memset(&addr_s,0,sizeof(addr_s));
addr_s.sin_family = AF_INET;
addr_s.sin_addr.s_addr = inet_addr("127.0.0.1");
addr_s.sin_port = htons(31180);
if(bind(sockfd,(SA *)&addr_s,sizeof(addr_s)) == -1)
{
perror("bind fail");
return -1;
}
length = sizeof(addr_c);
memset(buf,'\0',sizeof(buf));
if(recvfrom(sockfd,buf,sizeof(buf),0
,(SA *)&addr_c,&length) == -1)
{
perror("recvfrom fail");
}
printf("recvfrom client:%s\n",buf);
sendto(sockfd,buf,sizeof(buf),0,(SA *)&addr_c,sizeof(addr_c));
close(sockfd);
}
====================================
client.c:
====================================
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#define BUFFERSIZE 1024
typedef struct sockaddr SA;
int main(void)
{
int sockfd;
char buf[BUFFERSIZE];
struct sockaddr_in addr_s;
if((sockfd = socket(AF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket fail");
return -1;
}
memset(&addr_s,0,sizeof(addr_s));
addr_s.sin_family = AF_INET;
addr_s.sin_addr.s_addr = inet_addr("127.0.0.1");
addr_s.sin_port = htons(31180);
memset(buf,'\0',sizeof(buf));
sprintf(buf,"abcde");
if(sendto(sockfd,buf,sizeof(buf)
,0,(SA *)&addr_s,sizeof(addr_s)) < 0)
{
perror("sendto fail");
}
memset(buf,'\0',sizeof(buf));
recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
printf("recvfrom server:%s\n",buf);
close(sockfd);
}
⑶ 在windows下用C語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include <winsock2.h>
#include <windows.h>
與Linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
Winsock,一種標准API,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
Winsock 1:
Windows CE平台支持。
頭文件:WinSock.h
庫:wsock32.lib
Winsock 2:
部分平台如Windows CE貌似不支持。通過前綴WSA可以區別於Winsock 1版本。個別函數如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬於Winsock 1.1規范的函數;
頭文件:WinSock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll
(3)csocketudp編程擴展閱讀
winsock庫的載入與卸載:
載入:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
載入成功,返回值為0。
WORD wVersionRequested:載入的winsock版本,使用宏MAKEWORD(x, y),x表示高位元組,y表示低位元組。然而使用時MAKEWORD(2, 2)。高位元組與低位元組相同~~
LPWSADATA lpWSAData:WSADATA結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int WSACleanup(void);比起載入,卸載的函數真是輕松愉快。
⑷ Linux下的c語言UDP編程
read是直接讀取文件,scanf系列函數本身也得用read讀取文件。
bind是把socket和地址關聯,INADDR_ANY的意思是任何地址。比如你的設備有很多ip,客戶端向其中任何一個發送數據你的socket都能接收到。相應地如果你bind一個確定的ip的話,向其他ip發送數據你的socket是接收不到的。
⑸ TCP 和 UDP 在socket編程中的區別
區別:
1.基於連接與無連接
2.對系統資源的要求(TCP較多,UDP少)
3.UDP程序結構較簡單
4.流模式與數據報模式
TCP保證數據正確性,UDP可能丟包
TCP保證數據順序,UDP不保證
具體編程時的區別
socket()的參數不同
UDP Server不需要調用listen和accept
UDP收發數據用sendto/recvfrom函數
TCP:地址信息在connect/accept時確定UDP:在sendto/recvfrom函數中每次均 需指定地址信息
⑹ CSocket之UDP編程
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sersocket=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN seraddr;
seraddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
seraddr.sin_family=AF_INET;
seraddr.sin_port=htons(5000);
bind(sersocket,(SOCKADDR*)&seraddr,sizeof(SOCKADDR));
SOCKADDR clientaddr;
int len=sizeof(SOCKADDR);
char revbuf[100];
char sendbuf[100];
recvfrom(sersocket,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);
scanf("%s",&sendbuf);
sendto(sersocket,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);
closesocket(sersocket);
WSACleanup();
}
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1);
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockclient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN clientaddr;
clientaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
clientaddr.sin_family=AF_INET;
clientaddr.sin_port=htons(5000);
int len=sizeof(SOCKADDR);
char revbuf[100];
char sendbuf[100];
printf("請輸入內容:\n");
while(1)
{
scanf("%s",&sendbuf);
sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(SOCKADDR*)&clientaddr,len);
recvfrom(sockclient,revbuf,100,0,(SOCKADDR*)&clientaddr,&len);
printf("%s\n",revbuf);
}
closesocket(sockclient);
WSACleanup();
}
大同小異,CSocket只是進行了封裝而已,原理是一樣的,編程要思路靈活才行。
⑺ 簡述基於TCP和UDP的Socket編程的異同
Socket有兩種主要的操作方式:面向連接的和無連接的。無連接的操作使用UDP數據報協議,這個操作不需要連接一個目的的socket,它只是簡單地投出數據報,快速高效,但缺少數據安全性。面向連接的操作使用TCP協議,一個這個模式的socket必須在發送數據之前與目的地的socket取得一個連接,一旦連接建立了,socket就可以使用一個流介面:打開-讀-寫-關閉,所有的發送的信息都會在另一端以同樣的順序被接收,面向連接的操作比無連接的操作效率要低,但數據的安全性更高。基於TCP的socket編程是採用的流式套接字(SOCK_STREAM)。基於UDP採用的數據報套接字(SOCK_DGRAM).
流式套接字的設計是針對面向連接的網路應用,在數據傳輸之前需要預先建立連接,在數據傳輸過程中需要維持連接,在數據傳輸結束後需要釋放連接。由於採用校驗和、確認與超時等差錯控制手段,因此流式套接字可以保證數據傳輸的正確性。
數據報套接字(SOCK_DGRAM)提供無連接的、不可靠的數據傳輸服務,實際上它是基於TCP/IP協議族中的UDP協議實現的。數據報套接字提供無序、有差錯與有重復的數據流服務。數據報套接字的設計是針對無連接的網路應用,在數據傳輸之前不需要預先建立連接。由於只採用很有限的差錯控制手段,因此數據報套接字無法保證數據傳輸的正確性。
⑻ UDP和Socket通信步驟
這是在網上找到的,希望對你有所幫助。
sockets(套接字)編程有三種,流式套接字(SOCK_STREAM),數據報套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);
WINDOWS環境下TCP/UDP編程步驟:
1. 基於TCP的socket編程是採用的流式套接字。
在這個程序中,將兩個工程添加到一個工作區。要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:將套接字設置為監聽模式等待連接請求(listen());
4:請求到來後,接受連接請求,返回一個新的對應於此次連接的套接字(accept());
5:用返回的套接字和客戶端進行通信(send()/recv());
6:返回,等待另一連接請求;
7:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[50];
sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[50];
recv(sockConn,recvBuf,50,0);
printf("%s\n",recvBuf);
closesocket(sockConn);
}
}
客戶端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:向伺服器發出連接請求(connect());
3:和伺服器端進行通信(send()/recv());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
客戶端的代碼如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
recv(sockClient,recvBuf,50,0);
printf("%s\n",recvBuf);
send(sockClient,"hello",strlen("hello")+1,0);
closesocket(sockClient);
WSACleanup();
}
2.基於UDP的socket編程是採用的數據報套接字。
在這個程序中,將兩個工程添加到一個工作區。同時還要鏈接一個ws2_32.lib的庫文件。
伺服器端編程的步驟:
1:載入套接字型檔,創建套接字(WSAStartup()/socket());
2:綁定套接字到一個IP地址和一個埠上(bind());
3:等待和接收數據(sendto()/recvfrom());
4:關閉套接字,關閉載入的套接字型檔(closesocket()/WSACleanup())。
伺服器端代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 )
{
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 )
{
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(7003);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[50];
SOCKADDR addrClient;
int len=sizeof(SOCKADDR);
recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);
printf("%s\n",recvBuf);
closesocket(sockSrv);
WSACleanup();
}
對於基於UDP的socket客戶端來說,要進行如下步驟:
1:創建一個套接字(socket);
2:向伺服器發送數據(sendto);
3:關閉套接字;
代碼如下:
#include <winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrClient;
addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrClient.sin_family=AF_INET;
addrClient.sin_port=htons(8889);
SOCKADDR_IN addrSrv;
sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));
}
LINUX環境下TCP/UDP編程步驟:
TCP編程步驟:
一. 服務端:
1.socket(int domain,int type,int protocol):建立套接字;
2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本機地址和埠跟上一步建立的socket綁定在一起;
3.listen(int sockid,int qsize):監聽某套接字;
4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;
5.recv(int fd,void *buf,size_t nbytes,int flags):從套接字接收數據;
6.close(fd) 和close(sockid)
二.客戶端:
1. socket():建立套接字;
2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):連接到伺服器;
3. send(int sockfd,const void *buf,size_t nbytes,int flags):發送數據到伺服器.
4. close(sockid);
UDP編程步驟:
一,服務端:
1. socket():同上;
2. bind():同上;
3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收數據,並且記錄下接收到的數據來源;一定要注意這里的參數addrlen,它不僅是函數的輸出,也是函數的輸入!所以要在調用該函數之前對addrlen賦值sizeof(struct sockaddr)。否則返回的地址from將會出錯!
4. close(sockfd);
二. 客戶端:
1. socket();同上;
2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址發送數據;
3. close(sockfd);
⑼ 怎麼寫一個socket編程,不管是udp的還是tcp的,可以不在同一個區域網中通信
網路通訊很簡單的道理 通許必須有一方是公網地址 這個所謂的公網地址簡單理解就是互聯網上公開的地址,能夠背直接訪問的IP地址
那麼你如果想實現中國到美國的通訊(下面簡稱2方通訊)方法有一下幾種
方法1:
中國這邊或者美國那邊至少一方是具有公網IP地址的 具有公網地址的作為服務端 另外一方作為客戶端連接(具體實現就是公網一方監聽自己的公網地址上的某個埠 客戶端直接連接對方的公網地址跟埠即可)( A<=====>B(公網地址) )
方法2:
2方都具有公網地址 那就更簡單 互相連接對方的公網地址跟埠即可(A(公網)<======>B(公網))
方法3:
2方都沒有公網地址(但是其中一方或者雙方都能在路由器上做埠映射 這個問題就轉化成了方法2 或者方法1)(A(埠映射)<===========B)
方法4:
2方都沒有公網地址也無法做埠映射 這個時候就要假設一個中轉的伺服器 2方都去連接那個中轉伺服器 通過服務來轉發消息(A(內網)<===============(消息中轉伺服器)============>B(內網))
目前QQ就是用的這樣的消息傳送方式
⑽ 有沒有windows下c語言實現udp協議的代碼
php">Windows下C語言的Socket編程例子(TCP和UDP)
一。<TCP>
server端:
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9//初始化WSA
10WORDsockVersion=MAKEWORD(2,2);
11WSADATAwsaData;
12if(WSAStartup(sockVersion,&wsaData)!=0)
13{
14return0;
15}
16
17//創建套接字
18SOCKETslisten=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
19if(slisten==INVALID_SOCKET)
20{
21printf("socketerror!");
22return0;
23}
24
25//綁定IP和埠
26sockaddr_insin;
27sin.sin_family=AF_INET;
28sin.sin_port=htons(8888);
29sin.sin_addr.S_un.S_addr=INADDR_ANY;
30if(bind(slisten,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR)
31{
32printf("binderror!");
33}
34
35//開始監聽
36if(listen(slisten,5)==SOCKET_ERROR)
37{
38printf("listenerror!");
39return0;
40}
41
42//循環接收數據
43SOCKETsClient;
44sockaddr_inremoteAddr;
45intnAddrlen=sizeof(remoteAddr);
46charrevData[255];
47while(true)
48{
49printf("等待連接... ");
50sClient=accept(slisten,(SOCKADDR*)&remoteAddr,&nAddrlen);
51if(sClient==INVALID_SOCKET)
52{
53printf("accepterror!");
54continue;
55}
56printf("接受到一個連接:%s ",inet_ntoa(remoteAddr.sin_addr));
57
58//接收數據
59intret=recv(sClient,revData,255,0);
60if(ret>0)
61{
62revData[ret]=0x00;
63printf(revData);
64}
65
66//發送數據
67char*sendData="你好,TCP客戶端! ";
68send(sClient,sendData,strlen(sendData),0);
69closesocket(sClient);
70}
71
72closesocket(slisten);
73WSACleanup();
74return0;
75}
復制代碼
client端:
復制代碼
1#include"stdafx.h"
2#include<WINSOCK2.H>
3#include<STDIO.H>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7
8intmain(intargc,char*argv[])
9{
10WORDsockVersion=MAKEWORD(2,2);
11WSADATAdata;
12if(WSAStartup(sockVersion,&data)!=0)
13{
14return0;
15}
16
17SOCKETsclient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
18if(sclient==INVALID_SOCKET)
19{
20printf("invalidsocket!");
21return0;
22}
23
24sockaddr_inserAddr;
25serAddr.sin_family=AF_INET;
26serAddr.sin_port=htons(8888);
27serAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
28if(connect(sclient,(sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
29{
30printf("connecterror!");
31closesocket(sclient);
32return0;
33}
34char*sendData="你好,TCP服務端,我是客戶端! ";
35send(sclient,sendData,strlen(sendData),0);
36
37charrecData[255];
38intret=recv(sclient,recData,255,0);
39if(ret>0)
40{
41recData[ret]=0x00;
42printf(recData);
43}
44closesocket(sclient);
45WSACleanup();
46return0;
47}
復制代碼
二.<UDP>
SERVER端
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9WSADATAwsaData;
10WORDsockVersion=MAKEWORD(2,2);
11if(WSAStartup(sockVersion,&wsaData)!=0)
12{
13return0;
14}
15
16SOCKETserSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
17if(serSocket==INVALID_SOCKET)
18{
19printf("socketerror!");
20return0;
21}
22
23sockaddr_inserAddr;
24serAddr.sin_family=AF_INET;
25serAddr.sin_port=htons(8888);
26serAddr.sin_addr.S_un.S_addr=INADDR_ANY;
27if(bind(serSocket,(sockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)
28{
29printf("binderror!");
30closesocket(serSocket);
31return0;
32}
33
34sockaddr_inremoteAddr;
35intnAddrLen=sizeof(remoteAddr);
36while(true)
37{
38charrecvData[255];
39intret=recvfrom(serSocket,recvData,255,0,(sockaddr*)&remoteAddr,&nAddrLen);
40if(ret>0)
41{
42recvData[ret]=0x00;
43printf("接受到一個連接:%s ",inet_ntoa(remoteAddr.sin_addr));
44printf(recvData);
45}
46
47char*sendData="一個來自服務端的UDP數據包 ";
48sendto(serSocket,sendData,strlen(sendData),0,(sockaddr*)&remoteAddr,nAddrLen);
49
50}
51closesocket(serSocket);
52WSACleanup();
53return0;
54}
復制代碼
CLIENT端
復制代碼
1#include"stdafx.h"
2#include<stdio.h>
3#include<winsock2.h>
4
5#pragmacomment(lib,"ws2_32.lib")
6
7intmain(intargc,char*argv[])
8{
9WORDsocketVersion=MAKEWORD(2,2);
10WSADATAwsaData;
11if(WSAStartup(socketVersion,&wsaData)!=0)
12{
13return0;
14}
15SOCKETsclient=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
16
17sockaddr_insin;
18sin.sin_family=AF_INET;
19sin.sin_port=htons(8888);
20sin.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
21intlen=sizeof(sin);
22
23char*sendData="來自客戶端的數據包. ";
24sendto(sclient,sendData,strlen(sendData),0,(sockaddr*)&sin,len);
25
26charrecvData[255];
27intret=recvfrom(sclient,recvData,255,0,(sockaddr*)&sin,&len);
28if(ret>0)
29{
30recvData[ret]=0x00;
31printf(recvData);
32}
33
34closesocket(sclient);
35WSACleanup();
36return0;
37}