導航:首頁 > 操作系統 > linuxudpclient

linuxudpclient

發布時間:2022-06-09 17:13:11

linux udp通信不成功

server端綁定地址錯誤。通常是

servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

㈡ linux下lcx支持udp嗎

A(windows) IP:X B(linux) IP:Y client 訪問的是Y ,想將服務定位到X上 直接修改IP地址啊~最簡單 其他的要看你什麼服務. 有些工具:lcx, rinetd 可能能滿足你

㈢ Linux客戶端和Window伺服器端udp socket通信不能成功

上面代碼沒問題,用Linux虛擬機和window調試時,不能選用Bridge方式,改用NAT方式即可。
因為系統環境不同,這樣慢慢地很容易就找到問題出在哪裡,打個比方?觸發了裡面有什麼內容,它發送一條消息少年。這類問題(是打比方,精確到埠,語言不同。列印出來看,一步一步排查就行,不限於這一個問題)
另外的可能就是linux客戶端上的代碼運行機制問題。
首先要100%確定客戶端的消息到了伺服器端,代碼上的表現可能也不同,有沒有表示什麼時候發完,這一類;
然後這時從伺服器端代碼接受消息的入口也就是第一行開始單步調試,是否觸發了伺服器的監聽函數。也就是結束符,伺服器可能一直在等單條消息的結束

㈣ linux 下用socket 文件傳輸問題(UDP)

要下班了,時間急,不寫代碼了先給你一個思路
1 實現最簡單的udp socket 模型,實現發送一個字元串。
2 實現一個簡單的打開文件,讀取文件的例子,如用fgets(),類似的函數有很多,然後再把讀取的文件內容忘另一個文件里寫(相關函數fopen(),write(),read())。
3 把上面兩個函數結合到一起,在客戶端實現打開要傳送的文件,按一定的大小讀取,讀取後調用sendto()發送到伺服器端。在伺服器端創建一個文件,然後調用recvfrom()接受客戶端發送過來的數據,向來是創建的那個文件中寫。
下面是改好的udp發送文件的例子。

伺服器端程序的編譯
gcc -o file_server  file_server
客戶端程序的編譯
gcc -o file_client  file_client.c
伺服器程序和客戶端程應當分別運行在2台計算機上.
伺服器端程序的運行,在一個計算機的終端執行
./file_server
客戶端程序的運行,在另一個計算機的終端中執行
./file_client  運行伺服器程序的計算機的IP地址
根據提示輸入要傳輸的伺服器上的文件,該文件在伺服器的運行目錄上
在實際編程和測試中,可以用2個終端代替2個計算機,這樣就可以在一台計算機上測試網路程序,
伺服器端程序的運行,在一個終端執行
./file_server
客戶端程序的運行,在另一個終端中執行
./file_client  127.0.0.1
說明: 任何計算機都可以通過127.0.0.1訪問自己. 也可以用計算機的實際IP地址代替127.0.0.1
//////////////////////////////////////////////////////////////////////////////////////
// file_server.c  文件傳輸順序伺服器示例
//////////////////////////////////////////////////////////////////////////////////////
//本文件是伺服器的代碼
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/
#define HELLO_WORLD_SERVER_PORT    6666
#define LENGTH_OF_LISTEN_QUEUE  20
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)
{
    //設置一個socket地址結構server_addr,代表伺服器internet地址, 埠
    struct sockaddr_in server_addr, pcliaddr;
    bzero(&server_addr,sizeof(server_addr)); //把一段內存區的內容全部設置為0
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

    //創建用於internet的據報套接字(UDPt,用server_socket代表伺服器socket

// 創建數據報套接字(UDP)
    int server_socket = socket(PF_INET,SOCK_DGRAM,0);
    if( server_socket < 0)
    {
        printf("Create Socket Failed!");
        exit(1);
    }
   
    //把socket和socket地址結構聯系起來
    if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
    {
        printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
        exit(1);
    }
   
    while (1) //伺服器端要一直運行
    {
        //定義客戶端的socket地址結構client_addr
        struct sockaddr_in client_addr;
        socklen_t n = sizeof(client_addr) ;
int length;

        char buffer[BUFFER_SIZE];
        bzero(buffer, BUFFER_SIZE);
        length = recvfrom(new_server_socket,buffer,BUFFER_SIZE,0,&pcliaddr,&n);
        if (length < 0)
        {
            printf("Server Recieve Data Failed!\n");
            break;
        }
        char file_name[FILE_NAME_MAX_SIZE+1];
        bzero(file_name, FILE_NAME_MAX_SIZE+1);
        strncpy(file_name, buffer, strlen(buffer)>FILE_NAME_MAX_SIZE?FILE_NAME_MAX_SIZE:strlen(buffer));
//        int fp = open(file_name, O_RDONLY);
//        if( fp < 0 )
        FILE * fp = fopen(file_name,"r");
        if(NULL == fp )
        {
            printf("File:\t%s Not Found\n", file_name);
        }
        else
        {
            bzero(buffer, BUFFER_SIZE);
            int file_block_length = 0;
//            while( (file_block_length = read(fp,buffer,BUFFER_SIZE))>0)
            while( (file_block_length = fread(buffer,sizeof(char),BUFFER_SIZE,fp))>0)
            {
                printf("file_block_length = %d\n",file_block_length);
                //發送buffer中的字元串到new_server_socket,實際是給客戶端
                if(send(new_server_socket,buffer,file_block_length,0)<0)
                {
                    printf("Send File:\t%s Failed\n", file_name);
                    break;
                }
                bzero(buffer, BUFFER_SIZE);
            }
//            close(fp);
            fclose(fp);
            printf("File:\t%s Transfer Finished\n",file_name);
        }
    }
}

//////////////////////////////////////////////////////////////////////////////////////
// file_client.c  文件傳輸客戶端程序示例
//////////////////////////////////////////////////////////////////////////////////////
//本文件是客戶機的代碼
#include <netinet/in.h>    // for sockaddr_in
#include <sys/types.h>    // for socket
#include <sys/socket.h>    // for socket
#include <stdio.h>        // for printf
#include <stdlib.h>        // for exit
#include <string.h>        // for bzero
/*
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
*/

#define HELLO_WORLD_SERVER_PORT    6666
#define BUFFER_SIZE 1024
#define FILE_NAME_MAX_SIZE 512

int main(int argc, char **argv)
{
    if (argc != 2)
    {
        printf("Usage: ./%s ServerIPAddress\n",argv[0]);
        exit(1);
    }

    //設置一個socket地址結構client_addr,代表客戶機internet地址, 埠
    struct sockaddr_in client_addr;
    bzero(&client_addr,sizeof(client_addr)); //把一段內存區的內容全部設置為0
    client_addr.sin_family = AF_INET;    //internet協議族
    client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動獲取本機地址
    client_addr.sin_port = htons(0);    //0表示讓系統自動分配一個空閑埠
    //創建用於internet的流協議(TCP)socket,用client_socket代表客戶機socket
    int client_socket = socket(AF_INET,SOCK_DGRAM,0);
    if( client_socket < 0)
    {
        printf("Create Socket Failed!\n");
        exit(1);
    }

    //設置一個socket地址結構server_addr,代表伺服器的internet地址, 埠
    struct sockaddr_in server_addr;
    bzero(&server_addr,sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //伺服器的IP地址來自程序的參數
    {
        printf("Server IP Address Error!\n");
        exit(1);
    }
    server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
    socklen_t server_addr_length = sizeof(server_addr);

    char file_name[FILE_NAME_MAX_SIZE+1];
    bzero(file_name, FILE_NAME_MAX_SIZE+1);
    printf("Please Input File Name On Server:\t");
    scanf("%s", file_name);
   
    char buffer[BUFFER_SIZE];
    bzero(buffer,BUFFER_SIZE);
    strncpy(buffer, file_name, strlen(file_name)>BUFFER_SIZE?BUFFER_SIZE:strlen(file_name));
    //向伺服器發送buffer中的數據
     socklen_t n = sizeof(server_addr) ;
    sendto(client_socket,buffer,BUFFER_SIZE,0,(struct sockaddr*)&server_addr,n);

//    int fp = open(file_name, O_WRONLY|O_CREAT);
//    if( fp < 0 )
    FILE * fp = fopen(file_name,"w");
    if(NULL == fp )
    {
        printf("File:\t%s Can Not Open To Write\n", file_name);
        exit(1);
    }
   
    //從伺服器接收數據到buffer中
    bzero(buffer,BUFFER_SIZE);
    int length = 0;
    while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
    {
        if(length < 0)
        {
            printf("Recieve Data From Server %s Failed!\n", argv[1]);
            break;
        }
//        int write_length = write(fp, buffer,length);
        int write_length = fwrite(buffer,sizeof(char),length,fp);
        if (write_length<length)
        {
            printf("File:\t%s Write Failed\n", file_name);
            break;
        }
        bzero(buffer,BUFFER_SIZE);   
    }
    printf("Recieve File:\t %s From Server[%s] Finished\n",file_name, argv[1]);
    return 0;
}

㈤ linux下udp實現文件的傳輸,盡量詳細點 思路我知道 就是不知道怎麼把文件名給傳過去

傳文件最好用個TCP。UDP會丟包的

////////////////////////////////////
//客戶端代碼
///////////////////////////////////

//本文件是客戶機的代碼
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <time.h> //for time_t and time
#include <arpa/inet.h>

#define HELLO_WORLD_SERVER_PORT 7754
#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
if (argc != 2)
{
printf("Usage: ./%s ServerIPAddress\n",argv[0]);
exit(1);
}

//time_t now;
FILE *stream;

//設置一個socket地址結構client_addr,代表客戶機internet地址, 埠
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr)); //把一段內存區的內容全部設置為0
client_addr.sin_family = AF_INET; //internet協議族
client_addr.sin_addr.s_addr = htons(INADDR_ANY);//INADDR_ANY表示自動獲取本機地址
client_addr.sin_port = htons(0); //0表示讓系統自動分配一個空閑埠
//創建用於internet的流協議(TCP)socket,用client_socket代表客戶機socket
int client_socket = socket(AF_INET,SOCK_STREAM,0);
if( client_socket < 0)
{
printf("Create Socket Failed!\n");
exit(1);
}
//把客戶機的socket和客戶機的socket地址結構聯系起來
if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))
{
printf("Client Bind Port Failed!\n");
exit(1);
}

//設置一個socket地址結構server_addr,代表伺服器的internet地址, 埠
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
if(inet_aton(argv[1],&server_addr.sin_addr) == 0) //伺服器的IP地址來自程序的參數
{
printf("Server IP Address Error!\n");
exit(1);
}
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
socklen_t server_addr_length = sizeof(server_addr);
//向伺服器發起連接,連接成功後client_socket代表了客戶機和伺服器的一個socket連接
if(connect(client_socket,(struct sockaddr*)&server_addr, server_addr_length) < 0)
{
printf("Can Not Connect To %s!\n",argv[1]);
exit(1);
}

char buffer[BUFFER_SIZE];
bzero(buffer,BUFFER_SIZE);

//從伺服器接收數據到buffer中
int length = recv(client_socket,buffer,BUFFER_SIZE,0);

if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
exit(1);
}

printf("\n%s\n",buffer);

bzero(buffer,BUFFER_SIZE);

bzero(buffer,BUFFER_SIZE);
strcpy(buffer,"Hello, World! From Client\n");
//向伺服器發送buffer中的數據
send(client_socket,buffer,BUFFER_SIZE,0);

if((stream = fopen("data","w+t"))==NULL)
{
printf("The file 'data' was not opened! \n");
}

else
bzero(buffer,BUFFER_SIZE);
length = 0;
while( length = recv(client_socket,buffer,BUFFER_SIZE,0))
{
if(length < 0)
{
printf("Recieve Data From Server %s Failed!\n", argv[1]);
break;
}

int write_length = fwrite(buffer,sizeof(char),length,stream);
if (write_length<length)
{
printf("File is Write Failed\n");
break;
}
bzero(buffer,BUFFER_SIZE);
}
printf("Recieve File From Server[%s] Finished\n", argv[1]);

//關閉 文件
fclose(stream);

//關閉socket
close(client_socket);
return 0;
}

////////////////////////////////////
//伺服器代碼
///////////////////////////////////
//本文件是伺服器的代碼
#include <netinet/in.h> // for sockaddr_in
#include <sys/types.h> // for socket
#include <sys/socket.h> // for socket
#include <stdio.h> // for printf
#include <stdlib.h> // for exit
#include <string.h> // for bzero
#include <time.h> //for time_t and time

#define HELLO_WORLD_SERVER_PORT 7754
#define LENGTH_OF_LISTEN_QUEUE 20
#define BUFFER_SIZE 1024

int main(int argc, char **argv)
{
//設置一個socket地址結構server_addr,代表伺服器internet地址, 埠
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr)); //把一段內存區的內容全部設置為0
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htons(INADDR_ANY);
server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);
// time_t now;
FILE *stream;

//創建用於internet的流協議(TCP)socket,用server_socket代表伺服器socket
int server_socket = socket(AF_INET,SOCK_STREAM,0);
if( server_socket < 0)
{
printf("Create Socket Failed!");
exit(1);
}

//把socket和socket地址結構聯系起來
if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))
{
printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);
exit(1);
}

//server_socket用於監聽
if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )
{
printf("Server Listen Failed!");
exit(1);
}

while (1) //伺服器端要一直運行
{

struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);

int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
if ( new_server_socket < 0)
{
printf("Server Accept Failed!\n");
break;
}

char buffer[BUFFER_SIZE];
bzero(buffer, BUFFER_SIZE);

strcpy(buffer,"Hello,World! 從伺服器來!");
strcat(buffer,"\n"); //C語言字元串連接

send(new_server_socket,buffer,BUFFER_SIZE,0);

bzero(buffer,BUFFER_SIZE);
//接收客戶端發送來的信息到buffer中
length = recv(new_server_socket,buffer,BUFFER_SIZE,0);

if (length < 0)
{
printf("Server Recieve Data Failed!\n");
exit(1);
}
printf("\n%s",buffer);

if((stream = fopen("/home/administrator/110405A000.jpg","r"))==NULL)
{
printf("The file 'data1' was not opened! \n");
exit(1);
}
else

printf("The file 'filename' was opened! \n");
bzero(buffer,BUFFER_SIZE);

int lengsize = 0;
while((lengsize = fread(buffer,1,1024,stream)) > 0)
{

printf("lengsize = %d\n",lengsize);

if(send(new_server_socket,buffer,lengsize,0)<0)
{
printf("Send File is Failed\n");
break;
}

bzero(buffer, BUFFER_SIZE);

}
if(fclose(stream))
printf("The file 'data' was not closed! \n");
exit(1);

//關閉與客戶端的連接
close(new_server_socket);
}
//關閉監聽用的socket
close(server_socket);
return 0;
}

android和linux可以通過udp通信嗎

由於UDP通信不需要事先建立連接,因此不需要TCP中的connect函數。

伺服器端的步驟如下:

1. socket: 建立一個socket

2. bind: 將這個socket綁定在某個埠上(AF_INET)

3. recvfrom: 如果沒有客戶端發起請求,則會阻塞在這個函數里

4. close: 通信完成後關閉socket

客戶端的步驟如下:

1. socket: 建立一個socket

2. sendto: 相伺服器的某個埠發起請求(AF_INET)

3. close: 通信完成後關閉socket


可以看到,和TCP相比,步驟少了一些。


這里我們用到了兩個新的函數:

int recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * src_addr, socklen_t * addrlen);

int sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr, socklen_t addrlen);


recvfrom用於接收數據,sendto用於發送數據


recvfrom:

socket:socket套接字

buf:接收到的數據的存放位置

flags:一般情況下為0

src_addr:接收的源地址

addrlen:地址長度


sendto:

socket:socket套接字

buf:要發送的數據的起始地址

flags:一般情況下為0

dest_addr:發送到的目的地址

addrlen:地址長度

還是先上代碼:

Makefile:

  1. all: server.c client.c
  2. gcc -Wall client.c -o client
  3. gcc -Wall server.c -o server
  4. clean:
  5. rm -rf *.o client server

㈦ linux c編寫udp程序的bind報錯

addr.sin_addr.s_addr=htons(SERVER_PORT);
這個是IP地址,你給的埠號。

㈧ C語 Linux UDP通信程序 Client端段錯誤

如果是gcc編譯的,在gcc的時候加入 -g的參數,然後再用gdb調試core文件,這樣就能知道問題在什麼地方了。

㈨ Linux系統如何阻擋UDP攻擊

UDP Server程序
1、編寫UDP Server程序的步驟
(1)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。
(2)初始化sockaddr_in結構的變數,並賦值。sockaddr_in結構定義:
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
這里使用「08」作為服務程序的埠,使用「INADDR_ANY」作為綁定的IP地址即任何主機上的地址。
(3)使用bind()把上面的socket和定義的IP地址和埠綁定。這里檢查bind()是否執行成功,如果有錯誤就退出。這樣可以防止服務程序重復運行的問題。
(4)進入無限循環程序,使用recvfrom()進入等待狀態,直到接收到客戶程序發送的數據,就處理收到的數據,並向客戶程序發送反饋。這里是直接把收到的數據發回給客戶程序。

2、udpserv.c程序內容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>

#define MAXLINE 80
#define SERV_PORT 8888

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
{
int n;
socklen_t len;
char mesg[MAXLINE];

for(;;)
{
len = clilen;
/* waiting for receive data */
n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
/* sent data back to client */
sendto(sockfd, mesg, n, 0, pcliaddr, len);
}
}

int main(void)
{
int sockfd;
struct sockaddr_in servaddr, cliaddr;

sockfd = socket(AF_INET, SOCK_DGRAM, 0); /* create a socket */

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(SERV_PORT);

/* bind address and port to socket */
if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind error");
exit(1);
}

do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;
}

UDP Client程序
1、編寫UDP Client程序的步驟
(1)初始化sockaddr_in結構的變數,並賦值。這里使用「8888」作為連接的服務程序的埠,從命令行參數讀取IP地址,並且判斷IP地址是否符合要求。
(2)使用socket()來建立一個UDP socket,第二個參數為SOCK_DGRAM。
(3)使用connect()來建立與服務程序的連接。與TCP協議不同,UDP的connect()並沒有與服務程序三次握手。上面我們說了UDP是非連接的,實際上也可以是連接的。使用連接的UDP,kernel可以直接返回錯誤信息給用戶程序,從而避免由於沒有接收到數據而導致調用recvfrom()一直等待下去,看上去好像客戶程序沒有反應一樣。
(4)向服務程序發送數據,因為使用連接的UDP,所以使用write()來替代sendto()。這里的數據直接從標准輸入讀取用戶輸入。
(5)接收服務程序發回的數據,同樣使用read()來替代recvfrom()。
(6)處理接收到的數據,這里是直接輸出到標准輸出上。

2、udpclient.c程序內容:
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <unistd.h>

#define MAXLINE 80
#define SERV_PORT 8888

void do_cli(FILE *fp, int sockfd, struct sockaddr *pservaddr, socklen_t servlen)
{
int n;
char sendline[MAXLINE], recvline[MAXLINE + 1];

/* connect to server */
if(connect(sockfd, (struct sockaddr *)pservaddr, servlen) == -1)
{
perror("connect error");
exit(1);
}

while(fgets(sendline, MAXLINE, fp) != NULL)
{
/* read a line and send to server */
write(sockfd, sendline, strlen(sendline));
/* receive data from server */
n = read(sockfd, recvline, MAXLINE);
if(n == -1)
{
perror("read error");
exit(1);
}
recvline[n] = 0; /* terminate string */
fputs(recvline, stdout);
}
}

int main(int argc, char **argv)
{
int sockfd;
struct sockaddr_in srvaddr;

/* check args */
if(argc != 2)
{
printf("usage: udpclient <IPaddress>\n");
exit(1);
}

/* init servaddr */
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERV_PORT);
if(inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
{
printf("[%s] is not a valid IPaddress\n", argv[1]);
exit(1);
}

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

do_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

return 0;
}

運行例子程序
1、編譯例子程序
使用如下命令來編譯例子程序:
gcc -Wall -o udpserv udpserv.c
gcc -Wall -o udpclient udpclient.c
編譯完成生成了udpserv和udpclient兩個可執行程序。

2、運行UDP Server程序
執行./udpserv &命令來啟動服務程序。我們可以使用netstat -ln命令來觀察服務程序綁定的IP地址和埠,部分輸出信息如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:32768 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
udp 0 0 0.0.0.0:32768 0.0.0.0:*
udp 0 0 0.0.0.0:8888 0.0.0.0:*
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 0.0.0.0:882 0.0.0.0:*
可以看到udp處有「0.0.0.0:8888」的內容,說明服務程序已經正常運行,可以接收主機上任何IP地址且埠為8888的數據。
如果這時再執行./udpserv &命令,就會看到如下信息:
bind error: Address already in use
說明已經有一個服務程序在運行了。

3、運行UDP Client程序
執行./udpclient 127.0.0.1命令來啟動客戶程序,使用127.0.0.1來連接服務程序,執行效果如下:
Hello, World!
Hello, World!
this is a test
this is a test
^d
輸入的數據都正確從服務程序返回了,按ctrl+d可以結束輸入,退出程序。
如果服務程序沒有啟動,而執行客戶程序,就會看到如下信息:
$ ./udpclient 127.0.0.1
test
read error: Connection refused
說明指定的IP地址和埠沒有服務程序綁定,客戶程序就退出了。這就是使用connect()的好處,注意,這里錯誤信息是在向服務程序發送數據後收到的,而不是在調用connect()時。如果你使用tcpmp程序來抓包,會發現收到的是ICMP的錯誤信息。
參考資料:http://www.cnpaf.net/Class/UDP/0532918532729212.html

閱讀全文

與linuxudpclient相關的資料

熱點內容
編譯原理如何運用到編程中 瀏覽:14
linux選擇資料庫 瀏覽:375
php兩個數組差集 瀏覽:978
迷你pdf閱讀器下載 瀏覽:432
做一個python小程序 瀏覽:654
pythonossystem和 瀏覽:644
win2008如何搭建ftp伺服器 瀏覽:53
安卓手機為什麼不翻牌 瀏覽:545
刪除pkpm及相關文件夾 瀏覽:480
房貸解壓銀行內部流程 瀏覽:734
安卓手機如何更改語音 瀏覽:599
android紅包實現 瀏覽:733
蘋果的nvme為什麼安卓不用 瀏覽:31
python輸入單詞統計個數 瀏覽:997
腳本軟體提取源碼 瀏覽:281
程序員能給自己的微信錢包刷錢么 瀏覽:72
怎麼讓小天才app查看寶貝的通訊錄 瀏覽:623
dxgpdf 瀏覽:257
哪個命令 瀏覽:51
文件不能打包壓縮 瀏覽:708