我知道有相關的問題已經回答,但我沒有設法解決我的問題。UDP C服務器沒有收到數據包
我有一個簡單的UDP客戶端服務器應用程序。客戶端&服務器看起來沒問題,但是服務器沒有收到來自客戶端的數據包,它只是無限接收到網絡ID 192(或者客戶端可能無法正確發送包)。
我似乎無法找出問題,地址&端口都沒問題,我沒有任何防火牆,我甚至爲端口添加了一個異常,只是爲了確保。如果我啓動服務器,我可以看到它正在聽,確定在正確的端口(netstat -a -s -p udp)。你能給我一個提示什麼是錯的嗎?
這裏是我的服務器代碼:
/*.. includes */
#define PORT 8888
#define NPACK 10
#define MAXLEN 100
void signalError(char* s){
perror(s);
exit(1);
}
int main()
{
struct sockaddr_in struct_srv, struct_client;
int s,i,cod, numbytes;
size_t clientSize;
int32_t nr;
int32_t sir1[MAXLEN], sir2[MAXLEN], sirComune[MAXLEN], nrEl1, nrEl2, nrComune;
//Creating the socket:
s = socket(PF_INET, SOCK_DGRAM, 0);
if(s==-1) signalError("Error while creating socket!");
memset(&struct_srv, 0, sizeof(struct_srv));
struct_srv.sin_family = AF_INET;
struct_srv.sin_addr.s_addr = htonl(INADDR_ANY);
struct_srv.sin_port = htons(PORT);
s = bind(s, (struct sockaddr*) &struct_srv, sizeof(struct_srv));
if(s==-1) signalError("Bind error. Port is already in use!");
//receive packets:
nrEl1 = -1;
char buf[MAXLEN];
printf("Accepting packets:\n");
//for(i=0;i<NPACK;i++) {
for(;;) {
//Receive packets from client:
clientSize = sizeof(struct_client);
numbytes = recvfrom(s, buf, MAXLEN - 1, 0,
(struct sockaddr*) &struct_client, &clientSize);
buf[numbytes] = '\0';
printf("Packet is %d long.\n", numbytes);
printf("Packet contains %s:\n", buf);
sleep(3);
}
close(s);
return 0;
}
而我的客戶端代碼:
/* includes */
#define SRV_IP "127.0.0.1"
#define NPACK 100
#define MAXLEN 100
#define PORT 8888
void signalError(char* s){
perror(s);
exit(1);
}
int main(void)
{
struct sockaddr_in struct_client;
int s, i, result, size_client = sizeof(struct_client);
int32_t nr, sir1[MAXLEN], sir2[MAXLEN];
s = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s==-1) signalError("Erorr creating socket!");
memset((char*) &struct_client, 0, sizeof(struct_client));
struct_client.sin_family = AF_INET;
struct_client.sin_addr.s_addr = htonl(INADDR_ANY);
struct_client.sin_port = htons(PORT);
if(inet_aton(SRV_IP, &struct_client.sin_addr)==0) {
fprintf(stderr, "inet_aton() failed\n");
exit(1);
}
char buf[MAXLEN];
int len;
for(i=0;i<NPACK;i++) {
printf("Give packet %d:\n", i+1);
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] = '\0';
printf("I've read %s\n", buf);
printf("Sending packet %d\n", i+1);
result = sendto(s, buf, sizeof(buf)+1, 0,
(struct sockaddr*) &struct_client, size_client);
if(result==-1) signalError("Error sending packets!");
}
close(s);
return 0;
}
你有沒有試過嗅探應用程序之間的數據包?簡單的netcat足以實現它。 – p4553d 2011-03-18 13:47:02
nr和buf是我必須發送2個整數數組到服務器。我第一次嘗試發送數字(沒有運氣),然後我想看看它是否適用於字符串。但這不是問題。我還添加了喬納森的第一個建議,但仍然是相同的結果。服務器只是收到垃圾。 – joanna 2011-03-18 14:23:30
根據上面的代碼,你仍然發送'&nr',這是從來沒有初始化。你需要設置'nr'使它發送除了已經存在的東西以外的東西,聽起來就像是ASCII字符「192」。 – Jonathan 2011-03-18 14:40:27