2013-01-17 68 views
0

我的服務器沒有收到客戶端的任何數據,但沒有錯誤,所以我真的不知道什麼是錯的。在客戶端的while循環中,我嘗試發送消息。服務器停留在recvfrom函數中,似乎沒有獲取數據。 cmd中的netstat顯示服務器偵聽端口50000.我給客戶端提供一個控制檯參數的IPv6地址:: 1。服務器不從客戶端接收數據

下面是該服務器的代碼:

#include <WinSock2.h> 
#include <ws2ipdef.h> 
#include <stdio.h> 

#define PORT 50000 

#define BUFFERSIZE 64 

void error(char *err) 
{ 
    fprintf(stderr,"%s: %d\n", err, WSAGetLastError()); 
    getchar(); 
    exit(EXIT_FAILURE); 
} 

int main(int argc, char *argv[]) 
{ 
struct sockaddr_in6 server, client; 
SOCKET sock; 
char buffer[BUFFERSIZE]; 
LPTSTR recvBuff[1024]; 
DWORD recvBuffLen = 1024UL; 
int len = sizeof(client); 

WORD wVersionRequested; 
WSADATA wsaData; 
wVersionRequested = MAKEWORD(1,1); 
WSAStartup(wVersionRequested, &wsaData); 

sock = socket(AF_INET6, SOCK_DGRAM, 0); 
if (sock < 0) 
    error("Fehler beim Anlegen des Sockets"); 

memset(&server, 0, sizeof (server)); 
memset(&client, 0, sizeof (client)); 

server.sin6_family = AF_INET6; 
server.sin6_port = htons(PORT); 
server.sin6_addr = in6addr_any; 

if (bind(sock, (struct sockaddr *) &server, sizeof(server)) == -1) 
    error("Fehler beim binden des Sockets"); 

while (1) 
{ 
    if (recvfrom(sock, buffer, BUFFERSIZE, 0, (struct sockaddr *)&client, &len) == -1) 
     error("Fehler beim erhalten von Daten"); 
    printf("..."); 
    printf("Pakete erhalten von: %s:%d\nDaten: %s\n\n", WSAAddressToString((struct sockaddr *)&client.sin6_addr, len, NULL, *recvBuff, &recvBuffLen), PORT, buffer); 
} 

closesocket(sock); 
return 0; 
} 

在這裏爲我的客戶代碼:

#include <WinSock2.h> 
#include <ws2ipdef.h> 
#include <stdio.h> 

#define PORT 50000 

#define BUFFERSIZE 64 

void error(char *err) 
{ 
fprintf(stderr,"%s: %d\n", err, WSAGetLastError()); 
getchar(); 
exit(EXIT_FAILURE); 
} 

int main(int argc, char *argv[]) 
{ 
struct sockaddr_in6 server; 
SOCKET sock; 
char buffer[BUFFERSIZE]; 
int len = sizeof(server); 

WORD wVersionRequested; 
WSADATA wsaData; 
wVersionRequested = MAKEWORD(1,1); 
WSAStartup(wVersionRequested, &wsaData); 

if (argc != 2) { 
    printf("Usage: %s <Server-IP>\n", argv[0]); 
    getchar(); 
    exit(0); 
} 

sock = socket(AF_INET6, SOCK_DGRAM, 0); 
if (sock == -1) 
    error("Socket Fehler"); 

memset(&server, 0, sizeof (server)); 

server.sin6_family = AF_INET6; 
server.sin6_port = htons(PORT); 
if ((WSAStringToAddressA(argv[1], AF_INET6, NULL, (SOCKADDR *)&server, &len)) < 0) 
    error("String konnte nicht aufgelößt werden"); 

while (1) 
{ 
    printf("\nDaten eingeben: (Enter für Text bestätigen, 'q' eingeben um zu beenden)"); 
    scanf("%[^\n]", buffer); 
    getchar(); 
    if (strcmp(buffer, "q") == 0) 
     exit(0); 

    if (sendto(sock, buffer, BUFFERSIZE, 0, (struct sockaddr *)&server, len) == -1) 
     error("Fehler bei Übertragung"); 
} 

closesocket(sock); 
return 0; 
} 

我希望有人可以提供幫助。

+0

赫姆你關閉你的防火牆? :-) –

+0

sendto返回什麼? –

+0

sendto返回64並且防火牆關閉 –

回答

0

只是一個猜測:這個問題可能是stdout緩衝 - 試試你的printf()

setbuf(stdout, NULL); 

或只是沖洗stdout禁用它:

printf("..."); 
printf("Pakete erhalten von: %s:%d\nDaten: %s\n\n", WSAAddressToString((struct sockaddr *)&client.sin6_addr, len, NULL, *recvBuff, &recvBuffLen), PORT, buffer); 
fflush(stdout); 
相關問題