C语言Socket服务器怎么给客户端发消息

C语言Socket服务器怎么给客户端发消息,第1张

socket

服务器给指定的客户端发消息该怎么处理(tcp)(c语言)

多个客户端之间进行通讯,通过服务器转发的形式,现在客户端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)

}


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/213352.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-05
下一篇2023-04-05

发表评论

登录后才能评论

评论列表(0条)

    保存