如果我运行下面的套接字服务器程序,则它不会在“接受”阶段等待客户端的连接,而是开始无限循环运行。我的程序被保存为server.c,我尝试使用以下命令在命令行中运行它:
$ ./server /tmp/socket
完整的套接字服务器代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
int server (int client_socket)
{
while (1) {
int length;
char* text;
if (read (client_socket, &length, sizeof (length)) == 0)
return 0;
text = (char*) malloc (length);
read (client_socket, text, length);
printf ("%s\n", text);
free (text);
if (!strcmp (text, "quit"))
return 1;
}
}
int main (int argc, char* const argv[])
{
const char* const socket_name = argv[1];
int socket_fd;
struct sockaddr_un name;
int client_sent_quit_message;
socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
name.sun_family = AF_LOCAL;
strcpy (name.sun_path, socket_name);
bind (socket_fd, (struct sockaddr*)&name, SUN_LEN (&name));
listen (socket_fd, 5);
do {
struct sockaddr_un client_name;
socklen_t client_name_len;
int client_socket_fd;
client_socket_fd = accept (socket_fd, &client_name, &client_name_len);
client_sent_quit_message = server (client_socket_fd);
close (client_socket_fd);
}
while (!client_sent_quit_message);
close (socket_fd);
unlink (socket_name);
return 0;
}
尝试以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
int server (int client_socket)
{
while (1) {
int length=30;
char* text;
text = (char*) malloc (length);
if (read (client_socket, text, length) == 0)
return 0;
printf ("%s\n", text);
if (!strcmp (text, "quit"))
{
free(text);
return 1;
}
free (text);
}
}
int main (int argc, char* const argv[])
{
const char* const socket_name = argv[1];
int socket_fd;
struct sockaddr_un name;
int client_sent_quit_message;
socket_fd = socket (PF_LOCAL, SOCK_STREAM, 0);
name.sun_family = AF_LOCAL;
strcpy (name.sun_path, socket_name);
bind (socket_fd, (struct sockaddr*)&name, SUN_LEN (&name));
listen (socket_fd, 5);
do {
struct sockaddr_un client_name;
int client_name_len=sizeof(struct sockaddr_un);
int client_socket_fd;
client_socket_fd = accept (socket_fd,(struct sockaddr *)&client_name, &client_name_len);
client_sent_quit_message = server (client_socket_fd);
close (client_socket_fd);
}
while (!client_sent_quit_message);
close (socket_fd);
unlink (socket_name);
return 0;
}
错误在于您没有将强制类型转换为sockaddr_un
to的accept函数sockaddr *
,然后第三个参数无效,我们无法直接类型转换socklen_t
为socklen_t *
将值存储为整数并将指针作为参数。
不要使用这种长度类型:
read(client_socket,&length,sizeof(length));
它从套接字读取输入,并尝试在&length中进行赋值,然后尝试将值存储在character变量中,这时会根据长度给出某些错误,或者读取length。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句