【发布时间】:2021-07-10 20:29:45
【问题描述】:
试图用 C 实现 TCP 回显服务器,并在搜索网络时遇到此代码并尝试编译它。它显示了一些与 socket.h 相关的错误
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <error.h>
#include <strings.h>
#include <unistd.h>
#define ERROR -1
#define MAX_CLIENTS 2
#define MAX_DATA 1024
int main(int argc, char **argv)
{
struct sockaddr_in server;
struct sockaddr_in client;
int sock;
int new;
int sockaddr_len = sizeof(struct sockaddr_in);
int data_len;
char data[MAX_DATA];
if((sock = socket(AF_INET, SOCK_STREAM, 0)) == ERROR)
{
perror("server socket: ");
exit(-1);
}
server.sin_family=AF_INET;
server.sin_port=htons(atoi(argv[1]));
server.sin_addr.s_addr=INADDR_ANY;
bzero(&server.sin_zero, 0);
if((bind(sock, (struct sockaddr *)&server, sockaddr_len)) == ERROR)
{
perror("bind: ");
exit(-1);
}
if((listen(sock, MAX_CLIENTS)) == ERROR)
{
perror("listen");
exit(-1);
}
while(1)
{
if((new = accept(sock, (struct sockaddr *)&client, sockaddr_len)) == ERROR)
{
perror("accept");
exit(-1);
}
printf("New Client connected from port no %d and IP %s\n", ntohs(client.sin_port), inet_ntoa(client.sin_addr));
data_len = 1;
while(data_len)
{
data_len = recv(new, data, MAX_DATA, 0);
if(data_len)
{
send(new, data, data_len, 0);
data[data_len] = '\0';
printf("Sent mesg: %s", data);
}
}
printf("Client disconnected\n");
close(new);
}
close(sock);
}
在使用 gcc (Debian 8.3.0-6) 8.3.0 在 Linux 中编译时,会引发以下警告/错误,
tcp_srv.c: In function ‘main’:
tcp_srv.c:50:54: warning: passing argument 3 of ‘accept’ makes pointer from integer without a cast [-Wint-conversion]
if((new = accept(sock, (struct sockaddr *)&client, sockaddr_len)) == ERROR)
^~~~~~~~~~~~
In file included from tcp_srv.c:4:
/usr/include/x86_64-linux-gnu/sys/socket.h:233:28: note: expected ‘socklen_t * restrict’ {aka ‘unsigned int * restrict’} but argument is of type ‘int’
socklen_t *__restrict __addr_len);
执行时的二进制文件给出了一个分段错误,我认为这是由于这个错误。尝试谷歌搜索此错误,但无法获得任何解决方案。
【问题讨论】:
-
嗨@akbharath-如果您查看手册页以接受错误是正确的-man7.org/linux/man-pages/man2/accept.2.html-
int accept(int sockfd, struct sockaddr *restrict addr,socklen_t *restrict addrlen);您是否可能忘记了sockaddr_len 上的&-即&sockaddr_len -
data[data_len] = '\0'; -
while(data_len)出错时 Data_len 将为 -1,导致循环运行直到无穷大。
标签: linux gcc tcp echo socklen-t