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

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

socket

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

多个客户端之间进行通讯,通过服务器转发的形式,现在客户端1请求向客户端2发送消息,先把消息发送到服务器,服务器怎么才能把消息转发到客户端2而不是转发给客户端3或者他自己。

先要理解socket是什么?

简单的说socket是一个全双工的通信通道,

即使用TCP或者UDP通信时均可以在发送消息的同时接受消息,

它不区分是否是服务器。

根据这个概念你的问题就很好回答。

》当客户端与服务器连接后。有什么方法使服务器可以随时随地发消息给客户端?

》我现在只能。客户端发个消息给服务器。服务器才能发个消息给客户端。也就是说客户端不发消息。服务器就没法发消息给客户端。

》求大牛给个思路。当连接后。客户端与服务器双方可以随时随地通信!

使用多线程,一个维持接受逻辑,一个维持送信逻辑,即可完成同时接受及发送。

客户端及服务器端均做上述设置。

而你的做法是在一个线程中执行接受与送信,因此只能按照顺序逻辑完成接收与送信。

关键点是多线程。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

【服务器端】

#include "stdafx.h"

#include <stdio.h>

#include <winsock2.h>

#include <winsock2.h>

#define SERVER_PORT 5208 //侦听端口

void main()

{

WORD wVersionRequested

WSADATA wsaData

int ret, nLeft, length

SOCKET sListen, sServer//侦听套接字,连接套接字

struct sockaddr_in saServer, saClient//地址信息

char *ptr//用于遍历信息的指针

//WinSock初始化

wVersionRequested=MAKEWORD(2, 2)//希望使用的WinSock DLL 的版本

ret=WSAStartup(wVersionRequested, &wsaData)

if(ret!=0)

{

printf("WSAStartup() failed!\n")

return

}

//创建Socket,使用TCP协议

sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)

if (sListen == INVALID_SOCKET)

{

WSACleanup()

printf("socket() faild!\n")

return

}

//构建本地地址信息

saServer.sin_family = AF_INET//地址家族

saServer.sin_port = htons(SERVER_PORT)//注意转化为网络字节序

saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY)//使用INADDR_ANY 指示任意地址

//绑定

ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer))

if (ret == SOCKET_ERROR)

{

printf("bind() faild! code:%d\n", WSAGetLastError())

closesocket(sListen)//关闭套接字

WSACleanup()

return

}

//侦听连接请求

ret = listen(sListen, 5)

if (ret == SOCKET_ERROR)

{

printf("listen() faild! code:%d\n", WSAGetLastError())

closesocket(sListen)//关闭套接字

return

}

printf("Waiting for client connecting!\n")

printf("Tips: Ctrl+c to quit!\n")

//阻塞等待接受客户端连接

while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。

{

length = sizeof(saClient)

sServer = accept(sListen, (struct sockaddr *)&saClient, &length)

if (sServer == INVALID_SOCKET)

{

printf("accept() faild! code:%d\n", WSAGetLastError())

closesocket(sListen)//关闭套接字

WSACleanup()

return

}

char receiveMessage[5000]

nLeft = sizeof(receiveMessage)

ptr = (char *)&receiveMessage

while(nLeft>0)

{

//接收数据

ret = recv(sServer, ptr, 5000, 0)

if (ret == SOCKET_ERROR)

{

printf("recv() failed!\n")

return

}

if (ret == 0) //客户端已经关闭连接

{

printf("Client has closed the connection\n")

break

}

nLeft -= ret

ptr += ret

}

printf("receive message:%s\n", receiveMessage)//打印我们接收到的消息。

}

// closesocket(sListen)

// closesocket(sServer)

// WSACleanup()

}

【客户端】

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

#include <winsock2.h>

#define SERVER_PORT 5208 //侦听端口

void main()


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存