#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib")
#define bufsize 512
typedef
struct
packinfo;
typedef
struct
backinfo;
intserversocketinit()
//執行socket函式
socket sersocket =
socket
(af_inet, sock_dgram, ipproto_udp)
;//使用udp協議
if(sersocket == invalid_socket)
//規定位址的一些引數
struct sockaddr_in seraddr;
seraddr.sin_family = af_inet;
seraddr.sin_port =
htons
(8888);
seraddr.sin_addr.s_un.s_addr = inaddr_any;
//執行bind函式,將socket與位址addr繫結if(
bind
(sersocket,
(struct sockaddr*
)& seraddr,
sizeof
(seraddr)
)== socket_error)
return sersocket;
}int
serverrecvmessage
(packinfo* pack,
int sersocket,
struct sockaddr_in* p_remoteaddr)
printf
("recv %d bytes\n"
, ret)
;return ret;
}int
serversendmessage
(backinfo* back,
int sersocket,
struct sockaddr_in* p_remoteaddr)
//printf("send %d bytes\n", ret);
return ret;
}int
main()
};backinfo back;
printf
("waiting for message...\n");
int ret =0;
back.id =1;
pack.id =0;
if((ret =
serverrecvmessage
(&pack, fd, p_remoteaddr))==
-1) file* fp =
fopen
("filepath"
,"a+");
fwrite
(pack.buf,
1, bufsize -
1, fp)
;//sleep(150);
while(1
)//printf("strlen:%d\n", strlen(pack.buf));if(
strlen
(pack.buf)
< bufsize-1)
memset
(pack.buf,0,
sizeof
(pack.buf));
if(ret =
serverrecvmessage
(&pack, fd, p_remoteaddr)==-
1)else
//printf("pack.id : %d\n", pack.id);
if(pack.id ==
(back.id+1)
)else
}closesocket
(fd)
;fclose
(fp)
;return0;
}
其中的filepath自定義或者通過客戶端傳輸(在傳輸檔案資訊前進行一次通訊)。
其中的backinfo
用於驗證包,backinfo.id
表示伺服器接受到的最新包。backinfo.status
暫時未使用。
#include
#include
#include
#include
#pragma comment(lib, "ws2_32.lib")
#define bufsize 512
#pragma pack(1)
typedef
struct
packinfo;
#pragma pack()
typedef
struct
backinfo;
intclientsocketinit()
//執行socket函式
socket clisocket =
socket
(af_inet, sock_dgram, ipproto_udp)
;//使用udp協議
if(clisocket == invalid_socket)
return clisocket;
}int
clientsendmessage
(packinfo* pack,
int clisocket,
struct sockaddr_in* p_seraddr)
printf
("send %d bytes\n"
, ret)
;return ret;
}int
clientrecvmessage
(backinfo* back,
int clisocket)
//printf("recv %d bytes\n", ret);
return ret;
}int
main()
backinfo back;
int id =1;
printf
("按回車鍵開始傳輸檔案");
system
("pause");
while(1
)int fret =
fread
(pack.buf,
1, bufsize-
1, fp);if
(fret ==0)
pack.buf[fret]
='\0'
;//printf("fret = %d\n", fret);
//printf("send message %s", pack.buf);if(
clientsendmessage
(&pack, clisocket,
&seraddr)==-
1)if(
clientrecvmessage
(&back, clisocket)==-
1)//printf("back.id : %d\n", back.id);
if(pack.id == back.id)
memset
(pack.buf,
0, bufsize);}
fclose
(fp)
;closesocket
(clisocket)
;return0;
}
由於fread函式返回值是count(坑人),而不是讀取的位元組數,為了獲得讀取的位元組數,此處直接使用了每次讀取1個位元組的方式。如果希望有更高的效率可以據此加以改進。
**中的filepath可自定義,或者新增一段**用以從命令列獲取檔案路徑。
linux下C 實現UDP通訊
簡要介紹udp原理,通過 例項講解。本篇部落格不強調server跟client 的概念,重在實現雙方互通。收的一方 socket bind recvfrom close 發的一方 socket sendto close 只有收資料的一方需要bind 而傳送的一方不需要bind 由上圖可以看出,bin...
socket實現UDP通訊
udp與tcp不同,是一種無連線的通訊方式,相比tcp而言更加靈活。利用socket實現udp的方式相比tcp而言也更加簡單。傳送方 1.初始化套接字 2.建立socket 3.利用sendto傳送資料 tcp是send 4.關閉socket 接收方 1.初始化套接字 2.建立socket並與本機進...
python實現UDP通訊
python可以通過socket模組進行網路中的計算機相互通訊。socket也就是套接字,理解套接字,可以認為他就是ip位址,埠,和應用協議組成的。自己是這麼認為的 網際網路中的每一台主機,都是通過ip位址來標識的,通過ip位址可以訪問一台主機,想要和另外一台主機的 相關程式進行連線就需要通過por...