本篇主要內容是socket,是本次課設的重點之一,本該非常用心認真的寫一篇分析,可是自己對它的認識還不夠,沒有任何思路,就不寫太多了,就對其整體做個大概的整理吧。
我做的是UDP通信,故與UDP無關的就不管了=。=
一、基本函數
client端
本部分在socket通信上的要求有三:
(1)對方的sockaddr,結構體structsockaddr_in their_addr;
their_addr.sin_family= AF_INET; // host byte order
their_addr.sin_port= htons(HEPORT); // short, network byte order
their_addr.sin_addr= *((struct in_addr *)he->h_addr);//their address
memset(&(their_addr.sin_zero),'\0', 8); // zero the rest of the struct
(2)socket的初始化設置
intsocket(int domain, int type,int protocol)
(3)sendto()函數,用來將數據由指定的socket傳給對方主機
intsendto ( socket s , const void * msg, int len, unsigned int flags,conststruct sockaddr * to , int tolen ) ;
Server端
本部分要求有四:
(1)本機的sockaddr,結構體structsockaddr_in my_addr;
my_addr.sin_family= AF_INET; // host byte order
my_addr.sin_port= htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr= INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero),'\0', 8); // zero the rest of the struct
(2)socket的初始化設置
(3)recvfrom()函數,用來接收遠程主機經指定的socket傳來的數據
ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen);
(4)bind()函數,用來綁定本地的接收端口
int bind(int sockfd, struct sockaddr *my_addr, int addrlen)
這兩個端具體的代碼我就不貼代碼了,網上很多。
如果要既有發送又有接收,那麼就只要把他們兩個整合在一起:
(1)socket()初始化;
(2)設置自己的sockaddr,my_addr;
(3)設置對方的sockaddr,their_addr;
(4)bind()綁定自己的地址;
(5)sendto()
(6)recvfrom()
//注意:recvfrom()在未收島信息時會一直監聽端口,導致阻塞,所以另一端一定也要相應的設置recvfrom()和send(),這樣才能讓程序順利執行。
另外,在編寫代碼時,還要注意兩點:
1.在含有賦值與比較的地方要及時加括號,防止出現出乎意料的錯誤,從而找不到錯誤在何處。
2.在填寫各函數的形參時,一定要注意原函數的數據類型要求,否則也會出現一些不明覺歷的錯誤。
本篇沒有詳細的代碼,因爲前部分的代碼別處太多了,後部分的代碼我沒有單獨寫的,只有整合了整個課設內容的代碼,不合適貼在這,就不發了。