C语言客户端与服务器

C语言客户端与服务器,第1张

这是WINDOWS的连网代码吧?

WSDstartup初始

socket创建套节字

bing监听

sendto发送

sockaddr_in IP结构体

网络的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()

你的文件中的问题

// 会阻塞进程,直到有客户端连接上来为止

// 既然是直到有客户端连接上,那么就要弄明白哪个是与客户端连接的套接字

// sockClient就是与客户端连接的套接字

sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len)

//接收并打印客户端数据

recv(sockClient, recvBuf, 100, 0)

printf("%s\n", recvBuf)

// 所以此处,应该把sockServer改为sockClient

send(/*sockServer*/sockClient, sendBuf, 100, 0)

PS:服务器客户端通信,是要保持服务器与客户端的连接。

而不能这样立即关闭,如果设置不对,立即关闭,缓冲区的数据是会丢失的。那客户端也就不会再收到数据了。

你可以加Sleep(10000)来测是通信过程

//关闭socket

closesocket(sockClient)


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存