當前位置:編程學習大全網 - 編程語言 - UDP和Socket通信步驟是什麽?

UDP和Socket通信步驟是什麽?

UDP Server程序\x0d\1、編寫UDP Server程序的步驟\x0d\(1)使用socket()來建立壹個UDP socket,第二個參數為SOCK_DGRAM。\x0d\(2)初始化sockaddr_in結構的變量,並賦值。sockaddr_in結構定義:\x0d\struct sockaddr_in {\x0d\uint8_t sin_len;\x0d\sa_family_t sin_family;\x0d\in_port_t sin_port;\x0d\struct in_addr sin_addr;\x0d\char sin_zero[8];\x0d\};\x0d\這裏使用“08”作為服務程序的端口,使用“INADDR_ANY”作為綁定的IP地址即任何主機上的地址。\x0d\(3)使用bind()把上面的socket和定義的IP地址和端口綁定。這裏檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程序重復運行的問題。\x0d\(4)進入無限循環程序,使用recvfrom()進入等待狀態,直到接收到客戶程序發送的數據,就處理收到的數據,並向客戶程序發送反饋。這裏是直接把收到的數據發回給客戶程序。\x0d\\x0d\2、udpserv.c程序內容:\x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\\x0d\#define MAXLINE 80\x0d\#define SERV_PORT 8888\x0d\\x0d\void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)\x0d\{\x0d\int n;\x0d\socklen_t len;\x0d\char mesg[MAXLINE];\x0d\\x0d\for(;;)\x0d\{\x0d\len = clilen;\x0d\/* waiting for receive data */\x0d\n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);\x0d\/* sent data back to client */\x0d\sendto(sockfd, mesg, n, 0, pcliaddr, len);\x0d\}\x0d\}\x0d\\x0d\int main(void)\x0d\{\x0d\int sockfd;\x0d\struct sockaddr_in servaddr, cliaddr;\x0d\\x0d\sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */\x0d\\x0d\/* init servaddr */\x0d\bzero(&servaddr, sizeof(servaddr));\x0d\servaddr.sin_family = AF_INET;\x0d\servaddr.sin_addr.s_addr = htonl(INADDR_ANY);\x0d\servaddr.sin_port = htons(SERV_PORT);\x0d\\x0d\/* bind address and port to socket */\x0d\if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)\x0d\{\x0d\perror("bind error");\x0d\exit(1);\x0d\}\x0d\\x0d\do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));\x0d\\x0d\return 0;\x0d\}\x0d\\x0d\UDP Client程序\x0d\1、編寫UDP Client程序的步驟\x0d\(1)初始化sockaddr_in結構的變量,並賦值。這裏使用“8888”作為連接的服務程序的端口,從命令行參數讀取IP地址,並且判斷IP地址是否符合要求。\x0d\(2)使用socket()來建立壹個UDP socket,第二個參數為SOCK_DGRAM。\x0d\(3)使用connect()來建立與服務程序的連接。與TCP協議不同,UDP的connect()並沒有與服務程序三次握手。上面我們說了UDP是非連接的,實際上也可以是連接的。使用連接的UDP,kernel可以直接返回錯誤信息給用戶程序,從而避免由於沒有接收到數據而導致調用recvfrom()壹直等待下去,看上去好像客戶程序沒有反應壹樣。\x0d\(4)向服務程序發送數據,因為使用連接的UDP,所以使用write()來替代sendto()。這裏的數據直接從標準輸入讀取用戶輸入。\x0d\(5)接收服務程序發回的數據,同樣使用read()來替代recvfrom()。\x0d\(6)處理接收到的數據,這裏是直接輸出到標準輸出上。\x0d\\x0d\2、udpclient.c程序內容:\x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\#include \x0d\\x0d\#define MAXLINE 80\x0d\#define SERV_PORT 8888\x0d\\x0d\void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)\x0d\{\x0d\int n;\x0d\char sendline[MAXLINE], recvline[MAXLINE + 1];\x0d\\x0d\/* connect to server */\x0d\if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)\x0d\{\x0d\perror("connect error");\x0d\exit(1);\x0d\}\x0d\\x0d\while(fgets(sendline, MAXLINE, fp) != NULL)\x0d\{\x0d\/* read a line and send to server */\x0d\write(sockfd, sendline, strlen(sendline));\x0d\/* receive data from server */\x0d\n = read(sockfd, recvline, MAXLINE);\x0d\if(n == -1)\x0d\{\x0d\perror("read error");\x0d\exit(1);\x0d\}\x0d\recvline[n] = 0; /* terminate string */\x0d\fputs(recvline, stdout);\x0d\}\x0d\}\x0d\\x0d\int main(int argc, char **argv)\x0d\{\x0d\int sockfd;\x0d\struct sockaddr_in srvaddr;\x0d\\x0d\/* check args */\x0d\if(argc != 2)\x0d\{\x0d\printf("usage: udpclient \n");\x0d\exit(1);\x0d\}\x0d\\x0d\/* init servaddr */\x0d\bzero(&servaddr, sizeof(servaddr));\x0d\servaddr.sin_family = AF_INET;\x0d\servaddr.sin_port = htons(SERV_PORT);\x0d\if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr)

  • 上一篇:山東勞動職業技術學院位置
  • 下一篇:常州數學輔導班哪裏好
  • copyright 2024編程學習大全網