window下實現UDP通訊 大檔案傳輸

2021-10-03 12:37:20 字數 3919 閱讀 8890

#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...