【发布时间】:2013-08-14 08:56:41
【问题描述】:
我正在用 C 编写一个服务器和两个客户端。一个客户端是接收命令的“从”类型客户端,另一个是发送命令的“主”类型客户端。我希望从服务器的多个实例连接到服务器,并能够通过服务器从主服务器向特定的从服务器发送命令。
我的问题是如何指定要将命令发送到的客户端?
这是我的服务器的一个非常基本的示例(没有错误检查) 我的实际服务器具有错误检查等功能,但是发布时间太长(并且无论如何都不会为任何人编译,因为我的项目中存在对其他文件的依赖关系)
#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int server_portnumber = 51739;
int main() {
int listenFD;
int connectFD;
socklen_t length;
struct sockaddr_in s1;
struct sockaddr_in s2;
listenFD = socket( AF_INET , SOCK_STREAM , 0 );
memset( &s1, 0, sizeof( s1 ) );
s1.sin_family = AF_INET;
s1.sin_addr.s_addr = INADDR_ANY;
s1.sin_port = server_portnumber;
bind( listenFD , (struct sockaddr*) &s1 , sizeof( s1 ) );
length = sizeof( s1 );
getsockname( listenFD , (struct sockaddr*) &s1 , &length );
listen( listenFD , 512 );
signal( SIGCHLD , SIG_IGN );
while(1) {
length = sizeof( s2 );
connectFD = accept( listenFD , (struct sockaddr*) &s2 , &length );
if( !fork() ){
close( listenFD );
int select = 0;
while( read( connectFD , &select, sizeof( int ) ) ) {
switch( select ) {
case 10:
// opcode
break;
case 20:
// command
break;
default:
break;
}
}
close( connectFD );
exit(0);
}
}
}
【问题讨论】:
-
请显示实际编译的代码,并演示您需要帮助的问题。这段代码充满了不匹配的括号和大括号、错误类型的参数(例如,将 int 而不是 addrlen 的指针传递给
getsockname和accept),明显缺少代码(如果你不调用 @987654324 @ 在某个地方获取您的端口号,您的代码将无法在任何英特尔机器上运行),不那么明显的缺失代码(您的fork循环最好不要像那样结束……如果您收到错误消息accept,你真的只是忽略它并尽可能快地一遍又一遍地得到同样的错误吗?) -
我已经更新了 OP 中的代码。抱歉,我只是从我的实际服务器中提取代码来举个例子,因为在这里发布的内容太多(而且它对我项目中的其他文件有很多依赖关系)为了简洁起见,我没有在这个例子中包含错误检查.
标签: c sockets network-programming