2016-02-05 47 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

相关问题