我正在撰寫一個簡單的 C 代碼來創建一個監聽套接字。代碼如下:
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/ip.h>
void main() {
struct sockaddr_in server;
struct sockaddr_in client;
int clientlen;
char buf[1500];
int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
memset((char *)&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(9090);
if(bind(sock, (struct sockaddr *) &server, sizeof(server)) < 0)
error("ERROR on binding");
while(1) {
bzero(buf, 1500);
recvfrom(sock, buf, 1500-1, 0, (struct sockaddr *) &client, &clientlen);
printf("%s\n", buf);
printf("%d - %s\n", client.sin_port, client.sin_addr.s_addr);
}
close(sock);
}
代碼編譯沒有問題,但是當我使用 netcat 通過客戶端連接到服務器時:
nc -u 10.0.2.4 9090
然后我發送了一些訊息,訊息得到了回復,然后我收到了錯誤訊息。有人知道我為什么會有這種行為嗎?謝謝你。
uj5u.com熱心網友回復:
這里有兩個主要問題。首先,clientlen在recvfrom被呼叫之前預期包含地址結構的大小,但它是未初始化的。所以設定如下:
int clientlen = sizeof(client);
其次,您%s用于列印client.sin_addr.s_addr但該欄位不是字串。您應該使用inet_ntoa將 a 轉換struct inaddr_t為字串:
printf("%d - %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/360425.html
上一篇:我應該使用什么方法讓TCP服務器在Python3中處理許多客戶端設備?
下一篇:服務器超時C#
