linux udp socket編程執行個體

來源:互聯網
上載者:User
1:udp通訊框圖
在上面的用戶端,也是可以執行bind()和connect操作的,在下面的用戶端代碼中,我們是這麼來實現的。2:udp server端代碼
#if 1#include "./../../udp_client/src/iolib/iolib.h" /* 添加使用者自已的I/O函數庫 */#define MAX_LINE 100//extern int checkSelect(int handfd,char *rwflag);void my_fun(char * p){if(p == NULL) /* 空串 */return;for (; *p != '\0'; p++)if(*p >= 'A'&& *p <= 'Z')*p = *p -'A'+ 'a';}int getUdpServerSocketId(int argc, char *argv[]){struct sockaddr_in servaddr;int sockfd;if (argc != 3){fputs("usage: ./client serverIp serverPort\n", stderr);exit(1);}sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd == -1){perror("create udp socket....\n");}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &servaddr.sin_addr.s_addr);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("set ip address error!\n");exit(0);} if(bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == -1) {perror("call to bind");     exit(1);} return sockfd;}int main(int argc, char *argv[]){    struct sockaddr_in clientaddr;    int s_fd,i=0,found=0;;  socklen_t addr_len,sndAddrLen;    char buf[MAX_LINE];    char addr_p[INET_ADDRSTRLEN];    int n;    s_fd = getUdpServerSocketId(argc,argv);     while (1)     {          memset(buf,0,MAX_LINE);          sndAddrLen = addr_len = sizeof(clientaddr);           n = recvfrom(s_fd, buf, MAX_LINE, 0, (struct sockaddr *) &clientaddr, &addr_len);           if (n == -1)           {           perror("fail to receive\n");           exit(1);           }           else           {         printf("received from %s at PORT %d\n",inet_ntop(AF_INET, &clientaddr.sin_addr, addr_p, sizeof(addr_p)),ntohs(clientaddr.sin_port));printf("content is :len:%d %s\n",n, buf);my_fun(buf);while(i++<5){n = sendto(s_fd, buf, n, 0, (struct sockaddr *) &clientaddr, sndAddrLen);if (n == -1){perror("fail to send\n");exit(1);}sleep(2);}i=0;           }}if(close(s_fd) == -1){perror("fail to close");exit(1);}return 0;}#endif
3:udp client端代碼
#include "./iolib/iolib.h" /* 添加使用者自已的I/O函數庫 */#define MAX_LINE 80int getUdpClietnSocketId(int argc, char *argv[]){struct sockaddr_in servaddr,clientaddr;int sockfd;#if 0if (argc != 4){fputs("usage: ./client serverIp serverPort localIp\n", stderr);exit(1);}#endifsockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd == -1){perror("create udp socket....\n");}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(atoi(argv[2]));inet_aton(argv[1], &servaddr.sin_addr.s_addr);if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){printf("set ip address error!\n");exit(0);}#if 1if(argv[3]!=NULL){perror("bind");bzero(&clientaddr, sizeof(clientaddr));clientaddr.sin_family = AF_INET;clientaddr.sin_port = htons(atoi(argv[2]));inet_aton(argv[3], &clientaddr.sin_addr.s_addr);if(inet_pton(AF_INET, argv[3], &clientaddr.sin_addr) <= 0){printf("set ip address error!\n");exit(0);}    if (bind(sockfd, (struct sockaddr *) &clientaddr, sizeof(struct sockaddr_in)) == -1)    {    perror("udp bind......");    }}#endif//inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr.s_addr);if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))==-1){perror("udp connect....");exit(0);}return sockfd;}int main(int argc, char *argv[]){int s_fd,len,count=0;char buf[MAX_LINE];char rcvbuf[MAX_LINE];memset(buf,0,MAX_LINE);    s_fd = getUdpClietnSocketId(argc,argv);     while(1)     {    if(checkSelect(STDIN_FILENO,"r")==0)    {    memset(buf,0,MAX_LINE);#if 1   if(fgets(buf,MAX_LINE,stdin)!=NULL)   {   /*fgets()會在結尾將分行符號'\n'讀入到緩衝區,而gets()不會,因此需要將多餘的\n去掉,更改為字串結尾標識'\0'*/ buf[strlen(buf)-1]='\0';#endif#if 0 if(gets(buf)!=NULL) {#endif if((strlen(buf)==0)||(buf[0]=='\0')) {  // printf("send len:%d : %s\n",strlen(buf),buf); continue; } len = my_write(s_fd, buf, strlen(buf)); /* 發送字串,該串包含‘\0’結束符 */ if(len == -1) /* 寫操作失敗,程式退出 */ { perror("udp write...."); exit(1); } else { printf("send len:%d : %s\n",strlen(buf),buf); }     }     }    /* 讀取伺服器程式發回的串,由於是同一台主機通訊,不存在延時的問題。    * 但是在真正的網路環境中,要處理讀操作的延時問題。    */if(checkSelect(s_fd,"r")==0){memset(rcvbuf,0,sizeof(rcvbuf));while(1){len = read(s_fd, rcvbuf, sizeof(rcvbuf));if(len>0){printf("recV len;%d : %s\n",len, rcvbuf); /* 列印該串 */}if(len == -1) /* 讀失敗,退出程式 */{ exit(1);}break;}}//printf("-------------------\n");    syslog(LOG_USER|LOG_INFO,"count: %d",count++);     } if(close(s_fd) == -1) { /* 關閉通訊端,結束通訊 */ perror("fail to close"); exit(1); } return 0;}
4:代碼執行結果





其測試代碼可以在:linux udp測試代碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.