多个客户端之间进行通讯,通过服务器转发的形式,现在客户端1请求向客户端2发送消息,先把消息发送到服务器,服务器怎么才能把消息转发到客户端2而不是转发给客户端3或者他自己。
先要理解socket是什么?简单的说socket是一个全双工的通信通道,
即使用TCP或者UDP通信时均可以在发送消息的同时接受消息,
它不区分是否是服务器。
根据这个概念你的问题就很好回答。
》当客户端与服务器连接后。有什么方法使服务器可以随时随地发消息给客户端?
》我现在只能。客户端发个消息给服务器。服务器才能发个消息给客户端。也就是说客户端不发消息。服务器就没法发消息给客户端。
》求大牛给个思路。当连接后。客户端与服务器双方可以随时随地通信!
使用多线程,一个维持接受逻辑,一个维持送信逻辑,即可完成同时接受及发送。
客户端及服务器端均做上述设置。
而你的做法是在一个线程中执行接受与送信,因此只能按照顺序逻辑完成接收与送信。
关键点是多线程。
#include<stdio.h>#include<stdlib.h>#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define SERVERPORT 5555#define BACKLOG 10
#define MAXLEN 1024
int main(){
int sockfd,client_fd
int sin_size = 0
int recvlen = 0
char recvbuf[MAXLEN]={0}
struct sockaddr_in my_addr
struct sockaddr_in cli_addr
int iRet
/*建立socke通信*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("Create socket error\n\n")
exit(1)
}
printf("socket success\n")
my_addr.sin_family=AF_INET my_addr.sin_port=htons(SERVERPORT)
my_addr.sin_addr.s_addr=INADDR_ANY
memset(my_addr.sin_zero,0,8)
/*绑定socket端口*/
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
printf("bind error\n")
close(sockfd)
exit(1)
}
printf("bind success\n")
/*监听端口*/
if(listen(sockfd,BACKLOG) == -1){
printf("listen error\n!")
close(sockfd)
exit(1)
}
printf("listren success\n")
while(1) {
sin_size = sizeof(struct sockaddr_in)
/*阻塞等待客户端发送消息*/
if((client_fd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size)) == -1)
{
printf("accept error !")
continue
}
printf("accept success\n")
printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr))
/*fork进程,子进程处理接收的信息*/
iRet=fork()
if(iRet <0)
{
printf(" fork err, pid=[%d]", getpid())
}
/*fork返回0,为子进程*/
else if(iRet == 0)
{
printf("pid=[%d]", getpid())
printf("子进程\n")
memset(recvbuf,0,sizeof(recvbuf))
/*接收客户端发送的内容*/
if((recvlen = recv(client_fd,recvbuf,MAXLEN,0)) == -1)
{
printf("recv error\n")
close(client_fd)
exit(1)
}
printf("recvlen[%d]\n",recvlen)
printf("recvmsg:\n%s\n",recvbuf)
/*向客户端发送内容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)
{
printf("send error\n")
close(client_fd)
exit(1)
}
printf("sendmsg:\n%s\n",recvbuf)
close(client_fd)
exit(0)
}
/*父进程,返回子进程pid*/
else
{
printf("pid=[%d]", getpid())
printf("父进程\n")
continue
}
}
close(sockfd)
exit(0)
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)