我尝试基于 UNIX 网络套接字创建简单的客户端/服务器程序。
有服务器代码
/* Headers */
#include "common/service.h"
#include "net/protocol.h"
int main(int argc, char** argv) {
/* Setting up socket */
int sock = socket(AF_INET, SOCK_STREAM, 0);
$( sock < 0, "socket", NULL );
struct sockaddr_in srv_address, cli_address;
memset((char *) &srv_address, 0, sizeof(srv_address));
srv_address.sin_family = AF_INET;
srv_address.sin_addr.s_addr = INADDR_ANY;
srv_address.sin_port = htons(RKP_RL_DEFAULT_PORT);
$(
bind(sock, (struct sockaddr*) &srv_address, sizeof(srv_address)) < 0,
"bind", NULL
);
/* Listening */
listen(sock, 1);
/* Accepting */
int ca_len = sizeof(cli_address);
int cli_sock = accept( sock, (struct sockaddr*) &cli_address, &ca_len );
$( cli_sock < 0, "accept", NULL );
/* Processing */
char accept_buffer[RKP_BUFFER_SZ] = {0};
read( cli_sock, accept_buffer, RKP_BUFFER_SZ-1 );
printf( "Incoming message: %s", accept_buffer );
write( cli_sock, "OK", 3 );
close(cli_sock);
close(sock);
return 0;
}
客户端代码
/* Headers */
#include "common/service.h"
#include "net/protocol.h"
int main(int argc, char** argv) {
$( argc != 2, argv[0], "Wrong syntax" );
// argv[1] contains server address
int port = RKP_RL_DEFAULT_PORT;
int sock = socket( AF_INET, SOCK_STREAM, 0 );
$( sock < 0, "socket", NULL );
struct hostent* server;
server = gethostbyname(argv[1]);
$( server == NULL, "gethostbyname", "Host %s not found", argv[1] );
struct sockaddr_in srv_address;
memset( (char*) &srv_address, 0, sizeof(srv_address) );
srv_address.sin_family = AF_INET;
strncpy( (char*) &srv_address.sin_addr.s_addr, (char*) server->h_addr_list[0], server->h_length);
srv_address.sin_port = htons(port);
$( connect(sock, &srv_address, sizeof(srv_address)) < 0, "connect", NULL );
char accept_buffer[RKP_BUFFER_SZ];
memset( accept_buffer, 0, RKP_BUFFER_SZ );
printf("Enter message\n");
fgets( accept_buffer, RKP_BUFFER_SZ-1, stdin );
write( sock, accept_buffer, strlen(accept_buffer) );
memset( accept_buffer, 0, RKP_BUFFER_SZ );
read( sock, accept_buffer, RKP_BUFFER_SZ-1 );
printf( "Server answer: %s\n", accept_buffer );
close(sock);
return 0;
}
然后我使用参数 127.0.0.1
、localhost
和 192.168.0.1
启动服务器和客户端。两个程序都使用端口 6662。几秒钟后直到开始我得到错误:
connect: Connection timed out
我该如何解决?
最佳答案
引用这一行:
strncpy( (char*) &srv_address.sin_addr.s_addr, (char*) server->h_addr_list[0], server->h_length);
strncpy()
适用于 0
-终止的 char
-数组,C-“字符串”。因为你想复制二进制数据使用 memcpy()
相反。
memcpy(&srv_address.sin_addr.s_addr, server->h_addr_list[0], server->h_length);
此外,如果不是在 Windows 或一些旧的 UNIX 上,这一行
int ca_len = sizeof(cli_address);
应该是
socklen_t ca_len = sizeof(cli_address);
确定 accept()
的第三个参数的类型你想查阅你的文档吗?
关于c - unix 套接字 - 无法连接到服务器(连接超时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124226/