想实现一个程序 UDP例程的。 实现2个客户端通信, 而不是客户端于服务器的通信,大家帮忙想下怎么写啊。下面是我写的客户端和服务器的通信。 服务器作为中转数据
/* server.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#define LISTENQ 5
#define MAXLINE 512
#define max(x,y) (((x)>(y))?(x):(y))
int main()
{
int sockfd;
int size;
int nbytes;
struct sockaddr_in servaddr;
char message[MAXLINE];
char sndbuff[MAXLINE];
fd_set infds;
int maxfd;
/*创建套接字*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0){
printf("Socket created failed\n");
return -1;
}
/*填充socket_in 结构*/
servaddr.sin_family = AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if (bind(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
printf("bind failed\n");
return -1;
}
size = sizeof(servaddr);
while(1){
FD_ZERO(&infds);
FD_SET(fileno(stdin),&infds);
FD_SET(sockfd,&infds);
maxfd=max(fileno(stdin),sockfd)+1;
if (select(maxfd,&infds,NULL,NULL,NULL)==-1){
printf("select io error\n");
return -1;
}
/*如果scoket io 准备好了*/
if (FD_ISSET(sockfd,&infds)){
nbytes = recvfrom(sockfd, message, MAXLINE, 0, (struct sockaddr*)&servaddr, &size);
if (nbytes < 0){
printf("recvfrom(server) failed.\n");
return -1;
}
else{
message[nbytes]=0;
printf("receive message from %s %s", inet_ntoa(servaddr.sin_addr.s_addr), message);
}
}
/*如果是输入IO 准备好了*/
if (FD_ISSET(fileno(stdin),&infds)){
if (fgets(sndbuff, MAXLINE, stdin) == NULL){
return -1;
}
nbytes = sendto(sockfd, sndbuff, sizeof(sndbuff), 0, (struct sockaddr*)&servaddr, size);
if (nbytes < 0){
printf("sendto(server) failed.\n");
return -1;
}
}
}
close(sockfd);
return 0;
}
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#define LISTENQ 5
#define MAXLINE 512
#define max(x,y) (((x)>(y))?(x):(y))
int main()
{
int sockfd;
int nbytes;
struct sockaddr_in servaddr;
char message[MAXLINE];
char sndbuff[MAXLINE];
fd_set infds;
int maxfd;
/*创建套接字*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0){
printf("Socket created failed\n");
return -1;
}
/*填充socket_in 结构*/
servaddr.sin_family = AF_INET;
servaddr.sin_port=htons(6666);
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
while(1){
FD_ZERO(&infds);
FD_SET(fileno(stdin),&infds);
FD_SET(sockfd,&infds);
maxfd=max(fileno(stdin),sockfd)+1;
if (select(maxfd,&infds,NULL,NULL,NULL)==-1){
printf("select io error\n");
return -1;
}
/*如果scoket io 准备好了*/
if (FD_ISSET(sockfd,&infds)){
nbytes = recvfrom(sockfd, message, MAXLINE, 0, NULL, NULL);
if (nbytes < 0){
printf("recvfrom(server) failed.\n");
return -1;
}
else{
message[nbytes]=0;
printf("receive message from server %s", message);
}
}
/*如果是输入IO 准备好了*/
if (FD_ISSET(fileno(stdin),&infds)){
if (fgets(sndbuff, MAXLINE, stdin) == NULL){
return -1;
}
nbytes = sendto(sockfd, sndbuff, sizeof(sndbuff), 0, (struct sockaddr*)&servaddr, sizeof(servaddr));
if (nbytes < 0){
printf("sendto(server) failed.\n");
return -1;
}
}
}
close(sockfd);
return 0;
}
有个问题弄不明白, 我开了3个终端, 一个运行服务器 两个运行客户端
不同的客户端发送数据到服务器 服务器响应的数据返回给客户端, 但是不会出现紊乱, 好奇怪。 因为在server里面只有1个socket套接字, 都是往这个socket里面写数据, 为什么会那么准确的发送的不同的客户端呢。 就是客户端1 给服务器发送数据, 服务器发送数据会写入到客户端1, 而不会发送到客户端2. 为什么呢?