【问题标题】:Client server program in c message questionc消息问题中的客户端服务器程序
【发布时间】:2020-04-05 16:21:17
【问题描述】:

我最近用 c 编写了一个服务器客户端程序,但它似乎不起作用。编译它时我得到的唯一一件事是警告和客户端出现故障的事实。谁能帮我一点忙?

这是服务器代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int server_socket;
    server_socket = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_address;
    int addrlen = sizeof(server_address);
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9000);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind (server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
    int client_socket;
    listen(server_socket, 3);
    client_socket=accept(server_socket, NULL, (socklen_t*)&addrlen);
    char response[256];

    recv(server_socket, &response, sizeof(response), 0);

    printf("%s",response);
    pclose (server_socket);
    return (0);
}

这是客户端代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>  

int main()
{ 
    int network_socket; 
    network_socket = socket(AF_INET,SOCK_STREAM, 0);

    struct sockaddr_in server_address; 
    server_address.sin_family = AF_INET; 
    server_address.sin_port = htons(9000); 
    server_address.sin_addr.s_addr = INADDR_ANY; 

    int connection_status = connect(network_socket, (struct sockaddr*)&server_address, sizeof(server_address));
    if (connection_status == -1) { printf("ERROR"); } 

    char maw[256] = "this is a message"; send(network_socket, maw, sizeof(maw), 0); close(server_address); 
    return(0); 

    pclose(network_socket); 
}

【问题讨论】:

  • 继续,给我们一个线索:警告是什么?我感觉close(server_address)应该是close(network_socket)

标签: c server client


【解决方案1】:

服务器代码也有错误。

服务器代码:

当您想接收来自客户端的消息时,您必须在recv() 函数的代码中使用client_socket。不是server_socket 本身。

客户端代码:

为什么要使用pclose() 函数来关闭套接字?它用于管道并且需要一个FILE 指针。此外,该函数永远不会被调用(在 return 语句之后)。

这应该可以工作(在我的系统上测试过):

服务器:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    int server_socket;
    server_socket = socket(AF_INET,SOCK_STREAM,0);
    struct sockaddr_in server_address;
    int addrlen = sizeof(server_address);
    server_address.sin_family = AF_INET;
    server_address.sin_port = htons(9000);
    server_address.sin_addr.s_addr = INADDR_ANY;

    bind (server_socket, (struct sockaddr*) &server_address, sizeof(server_address));
    int client_socket;
    listen(server_socket, 3);
    client_socket=accept(server_socket, NULL, (socklen_t*)&addrlen);
    char response[256];

    recv(client_socket, &response, sizeof(response), 0);

    printf("%s",response);
    shutdown (client_socket, SHUT_RDWR);
    close (client_socket);
    shutdown (server_socket, SHUT_RDWR);
    close (server_socket);
    return (0);
}

客户:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>  

int main()
{ 
    int network_socket; 
    network_socket = socket(AF_INET,SOCK_STREAM, 0);

    struct sockaddr_in server_address; 
    server_address.sin_family = AF_INET; 
    server_address.sin_port = htons(9000); 
    server_address.sin_addr.s_addr = INADDR_ANY; 

    int connection_status = connect(network_socket, (struct sockaddr*)&server_address, sizeof(server_address));
    if (connection_status == -1) { printf("ERROR"); } 

    char maw[256] = "this is a message"; 
    send(network_socket, maw, sizeof(maw), 0);
    shutdown (network_socket, SHUT_RDWR);
    close(network_socket);
    return(0);
}

对于函数shutdown(),请参见answer

【讨论】:

  • 您好,非常感谢。我在我的系统上厌倦了它并且它不工作(不打印消息)关于我应该做什么的任何想法?再次感谢您的帮助
  • @nene 很抱歉我的回复晚了。您可以尝试检查服务器代码中 recv() 函数的返回值。它应该返回接收到的字节数或错误时返回-1
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 2016-03-30
  • 2011-11-23
  • 2014-09-08
  • 2011-06-03
相关资源
最近更新 更多