学习TCP/IP客户端服务器的搭建
2018-03-10 09:21
465 查看
原文链接
用C写服务器端(Server.cpp)#pragma comment(lib, "ws2_32.lib")//预编译#include <stdio.h>
#include <winsock2.h>
int main(int argc, char *argv[])
{
//step1:初始化Windows Socket 2.2库
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData);
//step2:创建一个新的Socket来响应客户端的连接请求
SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//step3:填写服务器地址信息
int port = 5150;// 端口为5150
SOCKADDR_IN serverAddr;
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
//serverAddr.sin_addr.s_addr =inet_addr("10.66.103.187");
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//IP地址为INADDR_ANY,使用htonl将IP地址转换为网络格式
//step4:绑定监听端口
bind(sListen, (SOCKADDR *)&serverAddr, sizeof(serverAddr));
//step5:开始监听,指定三次握手等待队列长度为5
listen(sListen, 5);
printf("开始监听......\n");
while(true)
{
//step6:接受新的连接
SOCKET sNewConnection;
SOCKADDR_IN clientAddr;
memset(&clientAddr, 0, sizeof(clientAddr));
int clientAddrLen = sizeof(clientAddr);
sNewConnection = accept(sListen,
(SOCKADDR *)&clientAddr, &clientAddrLen);
//step7:新的连接建立后,就可以互相通信了,
//在这个简单的例子中,
//我们发送"Welcome to Network Programing!",然后关闭连接
//进行数据交换
while(1)
{
char message[1024];
int recvSize = recv(sNewConnection,
message, sizeof(message), 0);
if(recvSize <= 0)
break;
printf("%s: %s\n", "hu", message);
char data[1024] = {0};
printf("%s: ","li");
scanf("%s",data);
send(sNewConnection, data, strlen(message)+1, 0);
}
//关闭与客户通讯的套接字
closesocket(sNewConnection);
printf("%s","另一端关闭");
}
//step8:关闭套接字
closesocket(sListen);
//step9:释放Windows Socket DLL的相关资源
WSACleanup();
return 0;
} 然后是客户端(client.cpp)
#include <stdio.h>
#include <winsock.h>
#pragma comment(lib, "ws2_32.lib")//这句话的前面意思是静态加入一个lib文件也就是库文件ws2_32.lib文件,提供了对以下网络相关API的支持,若使用其中的API,则应该将ws2_32.lib加入工程(否则需要动态载入ws2_32.dll)。
int main(int argc, char *argv[])
{
//int First,Second;
//step 1: 初始化Windows Socket 2.2库
WSADATA wsaData;//功能是:存放windows socket初始化信息
WSAStartup(MAKEWORD(2,2), &wsaData);
//step 2: 创建客户端SOCKET套接字
SOCKET sClient = socket(AF_INET, SOCK_STREAM, 0);
//step 3: 设置服务器地址
sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(sockaddr_in));//去掉没有影响,暂时不知用途
/*void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法*/
serverAddr.sin_family = AF_INET;
//serverAddr.sin_addr.s_addr = inet_addr(argv[1]);
//serverAddr.sin_port = htons((u_short)atoi(argv[2]));
serverAddr.sin_addr.s_addr =inet_addr("127.0.0.1");
//serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddr.sin_port = htons(5150);
//step 4: 连接服务器
connect(sClient, (SOCKADDR *)&serverAddr, sizeof(serverAddr));//sockaddr和sockaddr_in的区别:二者的占用的内存大小是一致的,因此可以互相转化,从这个意义上说,他们并无区别
//step 5:与服务器进行通讯
while(1)
{
char data[1024] = {0};
printf("%s: ","hu");
scanf("%s",data);
int sendSize = send(sClient, data, strlen(data)+1, 0);//第三个参数是缓冲区中数据的长度,返回所发送的数据的总长度或SOCKET_ERROR错误
int recvSize = recv(sClient, data, 1024, 0);//第三个参数是缓冲区的长度;成功执行时,返回接收到的字节数。另一端已关闭则返回0。失败返回-1
printf("%s: %s\n", "li", data);
}
//step 6:关闭套接字
closesocket(sClient);
//step 7:释放Winsock库
WSACleanup();
getchar();
getchar();
return 0;
}
相关文章推荐
- python TCP/IP 服务器/客户端
- 2015/12/14 Python网络编程,TCP/IP客户端和服务器初探
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- 学习淘淘商城第十九课(搭建单机版FastDFS图片服务器以及使用FastDFS-Client客户端进行简单测试)
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Python socket网络编程TCP/IP服务器与客户端通信
- TCP/IP通信 客户端、服务器 实例
- Linux基于TCP/IP简单的客户端、服务器通信程序实例
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- nodejs中tcp服务器的搭建和客户端通信的实现
- SVN学习之服务器和Tortoise客户端搭建
- Android_TCP/IP开发——聊天室模型(客户端与服务器进行通信)
- 大三软件工程小项目-小技术集合-tcp服务器搭建及客户端
- 搭建Twisted Reactor TCP 服务器与客户端(文末有福利)
- TCP/IP回声服务器客户端
- MFC网络编程TCP/IP的服务器与客户端代码
- C语言学习之Linux下TCP服务器与客户端的实现
- 学习淘淘商城第十九课(搭建单机版FastDFS图片服务器以及使用FastDFS-Client客户端进行简单测试)
- 黑马程序员 【】java学习之路——TCP(三)客户端上传文件到服务器