我想開發一個UDP客戶端服務器程序。這裏是我的代碼:UDP套接字 - 服務器沒有收到任何數據
服務器
int main(int argc, char *argv[]) {
struct sockaddr_in client, server;
int s, i=0;
socklen_t n;
char buf[4];
s=socket(AF_INET,SOCK_DGRAM,0);
server.sin_family=AF_INET;
server.sin_port=atoi(argv[1]);
inet_pton(AF_INET, "localhost", &(server.sin_addr));
bind(s,(struct sockaddr *)&server,sizeof(server));
n=sizeof(client);
while(1) {
recvfrom(s, buf, sizeof(buf), 0, (struct sockaddr *)&client, &n);
printf("%s", buf);
}
close(s);
return 0;
}
客戶
int main (int argc, char *argv[]) {
struct sockaddr_in client, server;
int s, n;
char buf[30];
char temp[4];
s=socket(AF_INET,SOCK_DGRAM,0);
server.sin_family=AF_INET;
server.sin_port=atoi(argv[2]);
inet_pton(AF_INET, argv[1], &(server.sin_addr));
n=sizeof(server);
while(1) {
scanf("%s", buf);
fflush(stdin);
sendto(s, buf, sizeof(buf), 0, (struct sockaddr *) &server, n);
}
close(s);
return 0;
}
在自然界中非常基本的,沒有任何的錯誤處理。服務器輸出任何客戶端發送。
在我測試某些東西時,我忘記刪除/釋放動態分配的內存後,它停止在我的Ubuntu機器上工作。它在不同的Linux服務器上工作得很好。
任何想法可能會造成這種情況?未封閉的端口,內存泄漏?我該如何解決?
'fflush(stdin);'調用*未定義的行爲*,所以不要使用它。 – MikeCAT
'printf(「%s」,buf);'也可能調用*未定義的行爲*如果buf中的內容不是以null結尾的字符串。在打印之前正確終止「字符串」,或以其他方式打印。 – MikeCAT
以前,我的程序被困在無法讀取數據,所以我不得不強制清理標準輸入緩衝區。任何更好的選擇? – ExtremistEnigma