2016-02-05 36 views
0

關注在這種情況下,我怎麼使用字符指針?(在Windows Socket編程)下的代碼</p> <p>SERVER.c</p> <pre><code>char* message = "hel"; send(clientsock, &message, 3, 0); </code></pre> <p>CLIENT.c

char** message = NULL; 
messageLen = recv(clientsock, **message, 2, 0); 

我的計劃char * message =「hel」中的SERVER.c源在char **消息中發送給CLIENT.c源。但它不起作用,我對我的計劃做了什麼?

Server.c完整的源

#pragma comment(lib, "ws2_32.lib") 
#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
#include <WinSock2.h> 
#include <stdlib.h> 

#define PORT 1234 
#define BACKLOG 10 



int main(int argc, char * argv[]) { 

SOCKET sock, clientsock; 
WSADATA wasData; 
struct sockaddr_in sockinfo, clientinfo; 
int clientsockSize; 
char* message = "hel"; 


if (WSAStartup(MAKEWORD(2, 2), &wasData) != 0) { //int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 
    return 0; 
} 

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // socket(AF_INET , type , protocol) 

if (sock == INVALID_SOCKET) { 
    return 1; 
} 

sockinfo.sin_family = AF_INET; 
sockinfo.sin_port = htons(PORT); // 
sockinfo.sin_addr.s_addr = htonl(INADDR_ANY); 

if (bind(sock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR) { // int bind (sock , (SOCKADDR*)&sockinfo , sizeof(sockinfo)) if true : return 0, else -1 
    return 2; 
} 

if (listen(sock, BACKLOG) == SOCKET_ERROR) { // Int listen (SOCKET , backlog) 
    return 3; 
} 


clientsockSize = sizeof(clientinfo); 

printf("접속 대기중...\n"); 

clientsock = accept(sock, (SOCKADDR*)&clientinfo, &clientsockSize); 


if (clientsock == INVALID_SOCKET) { 
    return 4; 
} 

printf("Send your message >> "); 

send(clientsock, &message, sizeof(message), 0); 

closesocket(sock); 
closesocket(clientsock); 

WSACleanup(); 

return -1; 

} 

CLIENT.c完整的源

#define _CRT_SECURE_NO_WARNINGS 
#define _WINSOCK_DEPRECATED_NO_WARNINGS 
#pragma comment(lib, "ws2_32.lib") 

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


int main(int argc, char* argv[]) { 

SOCKET clientsock; 
WSADATA wasData; 
struct sockaddr_in sockinfo; 

char** message = NULL; 

int messageLen; 

if (argc != 3) { 
    printf("Argument is not sufficient!\nInputed Argument >> %d", argc); 
    exit(1); 
} 

if (WSAStartup(MAKEWORD(2, 2), &wasData) != 0) { 
    printf("Error >> Init WSAStartup(..)\n"); 
} 

clientsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
if (clientsock == INVALID_SOCKET) 
    printf("Error >> socket(..)\n"); 
memset(&sockinfo, 0, sizeof(sockinfo)); // 구조체 초기화 

sockinfo.sin_family = AF_INET; 
sockinfo.sin_port = htons(atoi(argv[2])); 
sockinfo.sin_addr.s_addr = inet_addr(argv[1]); 

if (connect(clientsock, (SOCKADDR*)&sockinfo, sizeof(sockinfo)) == SOCKET_ERROR) 
    printf("Error >> connect(..)\n"); 

messageLen = recv(clientsock, **message, sizeof(message) - 1, 0); 
if (messageLen == -1) 
    printf("Error >> recv(..)\n"); 

printf("Server say >> %s", message); 
closesocket(clientsock); 
WSACleanup(); 

} 
+0

請參閱其他與套接字程序相關的問題。在其他問題中已經涉及指針的基本錯誤。 – Rohan

回答

1

客戶端

您必須使用分配的緩衝區從套接字接收字符。

您正在使用指針與博分配內存

char** message = NULL; 

爲指針,必須使用

char message[MAX_MSG_DIM] = {0}; 

char *message = malloc(MAX_MSG_DIM); 

注意到,recv當所有的性格都不會返回收到,但只有可用的字符。這意味着要接收來自客戶端recv的整個消息可能會被稱爲多一個。您必須對收到的字符進行計數,以確保整個消息是否已到達。

服務器端

要發送消息給客戶端你寫

send(clientsock, &message, sizeof(message), 0); 

這是錯誤的。首先必須通過消息的指針,其次大小不是檢索字符串長度的正確方法。您必須使用strlen來做到這一點。

send(clientsock, message, strlen(message)+1, 0); 

我寫strlen(message)+1由於這樣的事實,在你的客戶端,您不添加對接收緩衝區NULL終止。然後你必須從服務器端發送它。

+0

如果注意'recv()'的返回值,則不需要發送空終止符。它告訴你實際收到了多少字節。在處理字節時使用該數字並且不要超過它。例如,在將數據傳遞給'printf()'時,也要傳遞這個長度,那麼你不需要null來終止數據:'printf(「Server say >>%。* s」,messageLen,message) ;' –

+0

@RemyLebeau好吧,這是真的,但OP寫了'printf(「Server say >>%s」,message);'那需要'NULL'終止符。真正使用'char消息[MAX_MSG_DIM] = {0};對於這種特定情況''NULL'終止符已經在緩衝區內。我的意思是:我不能爲OP編寫所有可能的解決方案。我試圖給他/她一些提示,以開始糾正其代碼。 – LPs

相關問題