服务器端代码#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 3333 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */main()
{
int sock_fd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
int sin_size;
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */
if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket创建出错!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sock_fd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
perror("bind出错!");
exit(1);
}
if(listen(sock_fd, BACKLOG) == -1) {
perror("listen出错!");
exit(1);
}
while(1) {
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
perror("accept出错");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if(!fork()) { /* 子进程代码段 */
if(send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) {
perror("send出错!");
}
close(client_fd);
exit(0);
}
close(client_fd);
}
}
服务器端就只有一个SOCKET在监听,如果有5个客户端连接到服务器端,服务端如何区分这5个不同的客户端呀?请高手帮助
解决方案 »
- 在线等待:一个CTreeCtrl的新增修改子节点的简单问题
- 好看的东东2009-2-12
- 关于异形窗口标题栏去除
- 一个多线程的程序,运行了一段时间(有时候几天有时候几小时)后程序就死掉了???
- 声明DLL导出类是否需要连私有变量函数一起声明?
- 怎样在程序中创建SQL的视图
- 开发outlook add-in的问题
- COM+(MTS)中使用事务提交函数时m_psObjectContext->setcomple和m_psObjectContext->setabort出现错误,怎么解决?
- wtl 的checkbox/单选框怎么画?
- access数据库字段中字符数的限制该如何解决?
- vc 如何显示jpg图片
- 想知道windows任务管理器是如何绘制CPU使用记录曲线的?
fork之后
在子进程里面开个新的socket连接它
并把这个socket存进列表
可以用IP索引
没搞清楚楼上各位说什么哪里能见到SOCKET列表?服务器端就两个SOCKET,分别是client_fd和 sock_fd现在客户端有5个,怎么在服务器端区分?各位能不能结合具体代码说明一下,谢谢
明白了一点了,谢谢,但是还有一些不明白当有两个客户端连接上服务器端时,服务器从一个客户端a接收到数据,通过对数据的分析,将收到的数据经过处理后发送给客户端b。 此时,如何区别两个客户端? 服务器端只有一个accept函数返回的SOCKET,为client_fd,而客户端有多个,如何在服务器端区分?能以伪代码说明一下更好
我也在学习了!
---------------------------------------
站在服务器端的角度看,根据源IP和源端口。
while(1) {
sin_size = sizeof(struct sockaddr_in);
if((client_fd = accept(sock_fd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) {
perror("accept出错");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if(!fork()) { /* 子进程代码段 */
if(send(client_fd, "Hello, you are connected!\n", 26, 0) == -1) {
perror("send出错!");
}
close(client_fd);
exit(0);
}
close(client_fd);
} client_fd 啊,这个东西可以标识不同的客户端连接,你用一个结构来记录client_fd就可以了。