<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 1. 簡單的UDP回射程序 ### 1) 服務器udpsrv.c ~~~ #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/types.h> #define MAXLINE 1024 #define SA struct sockaddr void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen); int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr, cliaddr; sockfd = socket(AF_INET, SOCK_DGRAM, 0); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(9877); bind(sockfd, (SA *)&servaddr, sizeof(servaddr)); dg_echo(sockfd, (SA *)&cliaddr, sizeof(cliaddr)); return 0; } void dg_echo(int sockfd, SA *pcliaddr, socklen_t clilen) { int n; socklen_t len; char mesg[MAXLINE]; for ( ; ; ){ len = clilen; n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); sendto(sockfd, mesg, n, 0, pcliaddr, len); } } ~~~ ### 2) 客戶端udpcli.c ~~~ #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #define MAXLINE 1024 #define SA struct sockaddr void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen); int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; if (argc != 2){ printf("argument should be 2\n"); exit(-1); } bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(9877); inet_pton(AF_INET, argv[1], &servaddr.sin_addr); sockfd = socket(AF_INET, SOCK_DGRAM, 0); dg_cli(stdin, sockfd, (SA *)&servaddr, sizeof(servaddr)); exit(0); } void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; char sendline[MAXLINE], recvline[MAXLINE + 1]; while (fgets(sendline, MAXLINE, fp) != NULL){ sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); recvline[n] = 0; fputs(recvline, stdout); } } ~~~ 程序輸入輸出: 服務器: ~~~ leichaojian@ThinkPad-T430i:~$ ./udpsrv ~~~ 客戶端: ~~~ leichaojian@ThinkPad-T430i:~$ ./udpcli 127.0.0.1 i love you i love you ^C ~~~ ### 3) 服務器進程未運行時候客戶端的阻塞 ?? 如果服務器未啟動而客戶端發送一行文本,則客戶永遠阻塞于它的recvfrom調用,等待一個永不出現的服務器應答(所以下例中tcpdump只顯示第一行hello world的信息,而其余的信息已經被阻塞了): 啟動tcpdump: ~~~ root@ThinkPad-T430i:/home/leichaojian# tcpdump -i eth0 udp port 9877 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 22:18:50.481559 IP 192.168.0.7.60341 > 218.30.64.194.9877: UDP, length 12 ~~~ 直接啟動客戶端: ~~~ leichaojian@ThinkPad-T430i:~$ ./udpcli 218.30.64.194 hello world i love you what ~~~ ?? tcpdump只顯示hello world發送的文本,而接著發送i love you和what則沒有任何的反應,因為已經阻塞了。其中9877是服務器指定的總所周知的端口號,而60341為客戶端臨時端口。 ## 2. UDP的connect函數 ### 1) connect函數的起源 ?? 除非套接字已連接,否則異步錯誤是不會返回到UDP套接字的。我們可以給UDP套接字調用connect,然而這樣做的結果卻與TCP連接大相近庭:沒有三次握手過程。內核只是檢查是否存在立即可知的錯誤,記錄對端的IP地址和端口號(取自傳遞給connect的套接字地址結構),然后立即返回到調用進程。 ?? 有了這個能力后,我們必須區分: (1) 未連接UDP套接字,新創建UDP套接字默認如此。 (2) 已連接UDP套接字,對UDP套接字調用connect的結果。 ?? 對于已連接UDP套接字,與默認的未連接UDP套接字相比,發生了三個變化: (1) 我們再也不能給輸出操作指定目的IP地址和端口號。也就是說,我們不使用sendto而改用write或send。寫到已連接UDP套接字上的任何內容都自動發送到由connect指定的協議地址(例如IP地址和端口號) (2) 我們不必使用recvfrom以獲悉數據報的發送者,而改用read,recv或recvmsg。在一個已連接UDP套接字上,由內核為輸入操作返回的數據報只有那些來自connect所指定協議地址的數據報。目的地為這個已連接UDP套接字的本地協議地址(例如IP地址和端口號),發源地卻不是該套接字早先connect到的協議地址的數據報,不會投遞到該套接字。這樣就限制一個已連接UDP套接字能且僅能與一個對端交換數據報。 (3) 由已連接UDP套接字引發的異步錯誤會返回給它們所在的進程,而未連接UDP套接字不接收任何異步錯誤。 ### 2) 使用connect的客戶端 ~~~ #include "myunp.h" void dg_cli( FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen ) { int n; char sendline[ MAXLINE ], recvline[ MAXLINE + 1 ]; Connect( sockfd, ( SA * )pservaddr, servlen ); while ( fgets( sendline, MAXLINE, fp ) != NULL ){ write( sockfd, sendline, strlen( sendline ) ); n = read( sockfd, recvline, MAXLINE ); if ( n < 0 ){ printf("read error\n"); return; } recvline[ n ] = 0; fputs( recvline, stdout ); } } int main( int argc, char **argv ) { int sockfd; struct sockaddr_in servaddr; bzero( &servaddr, sizeof( servaddr ) ); servaddr.sin_family = AF_INET; servaddr.sin_port = htons( 9877 ); inet_pton( AF_INET, argv[ 1 ], &servaddr.sin_addr ); sockfd = Socket( AF_INET, SOCK_DGRAM, 0 ); dg_cli( stdin, sockfd, ( SA * )&servaddr, sizeof( servaddr ) ); exit( 0 ); } ~~~ ?? 如果服務端不啟動,則輸出結果如下: 服務端: ~~~ root@ThinkPad-T430i:/home/leichaojian# tcpdump -i eth0 udp port 9877 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 19:27:08.010090 IP 192.168.0.7.51328 > 218.30.64.194.9877: UDP, length 12 ~~~ 客戶端分兩種情況: 1)? ~~~ leichaojian@ThinkPad-T430i:~$ host leichaojian leichaojian.router has address 218.30.64.194 Host leichaojian.router not found: 5(REFUSED) Host leichaojian.router not found: 3(NXDOMAIN) leichaojian@ThinkPad-T430i:~$ ./dgcliconnect 218.30.64.194 hello world ^C ~~~ 2) 如果是以下的代碼,則服務端無任何抓包行為: ~~~ leichaojian@ThinkPad-T430i:~$ ./dgcliconnect 127.0.0.1 hello world n is:-1 read error ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看