c语言 对话程序,Windows下C语言实现聊天程序--网络编程(一)

5e578de8be63

客户端与服务器交互流程图

注意: 代码先运行服务器端,再运行客户端;

服务器端:

#include

#include

#include

#pragma comment(lib, "ws2_32.lib")

#define STRING_LENGTH_MAX 20;

/*

* 服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

*/

int main()

{

// 初始化

WSADATA wsadata;

WSAStartup(MAKEWORD(2, 2), &wsadata);

//创建socket

SOCKET serverSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

//绑定套接字

sockaddr_in sockAddr;

memset(&sockAddr, 0, sizeof(sockAddr));

sockAddr.sin_family = PF_INET;

sockAddr.sin_addr.s_addr = htons(INADDR_ANY);

sockAddr.sin_port = htons(1234);

bind(serverSock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

//进入监听状态

listen(serverSock, 20);

SOCKADDR cIntAddr; //接收客户端的请求

int nSize = sizeof(SOCKADDR);

SOCKET cIntSock = accept(serverSock, (SOCKADDR*)&cIntAddr, &nSize);

while (1) {

//SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);

char sendBuf[50];

char recvBuf[50];

recv(cIntSock, recvBuf, 50, 0);

printf("from client:");

printf("%s\n", recvBuf);

printf_s("please input your message:");

gets_s(sendBuf);

send(cIntSock, sendBuf, strlen(sendBuf) + 1, 0);

}

closesocket(cIntSock);

closesocket(serverSock);

WSACleanup();

return 0;

}

客户端:

#include

#include

#pragma comment (lib,"ws2_32.lib")

/* 客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket())

2:向服务器发出连接请求(connect())

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

*/

int initWSA();

int main()

{

int nRes = initWSA();

if (nRes != 0)

{

printf("WSAStartup 初始化失败! \n");

return 0;

}

printf("初始化成功!\n");

//创建套接字

SOCKET sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);

//向服务器发起请求

sockaddr_in sockAddr;

memset(&sockAddr, 0, sizeof(sockAddr));

sockAddr.sin_family = PF_INET; //IPv4

sockAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //服务器的IP

sockAddr.sin_port = htons(1234); //端口

//连接服务器

connect(sock, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR));

while (1) {

char recvBuf[50];

char sendBuf[50];

printf("To server: ");

gets_s(sendBuf);

send(sock, sendBuf, strlen(sendBuf) + 1, 0);

recv(sock, recvBuf, 50, 0);

printf("Message form server: ");

printf("%s\n", recvBuf);

}

//关闭套接字

closesocket(sock);

//终止使用 DLL

WSACleanup();

system("pause");

}

int initWSA()

{

//初始化

WSADATA wsadata;

//MAKEWORD(2, 2) : WinSock 规范的版本号,低字节为主版本号,高字节为副版本号(修正版本号)

//wsadata :为指向 WSAData 结构体的指针。

return WSAStartup(MAKEWORD(2, 2), &wsadata);

}

注意客户端与服务器接受信息的顺序。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值