TCP服务端
Socket->bind->listen->accept->send/recv->close
创建过程
1、新建一个常规空项目项目
按确定后->按项目(添加新项),如下图->添加
2、增加代码,试运行,查看程序是否出错
程序代码如下:
#include<stdio.h>
#include<stdlib.h>
void main(void)
{
printf(“hello\n”);
System(“pause”);
}
3、注释掉上面的内容,输入下列工程代码
程序代码如下:
#pragma comment(lib,"ws2_32.lib")
#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>
void main(void)
{
WSADATA wsData;
int ClientAddrLen;//客户端地址长度
SOCKADDR_IN ClientAddr;//客户端地址
SOCKET ListeningSocket;
SOCKADDR_IN ServerAddr;//服务器地址
char DataBufer[1024];
int Ret;
SOCKET NewConnect;
int Port = 5150;
if ((Ret = WSAStartup(MAKEWORD(2, 2), &wsData)) != 0)
//初始化windows套接字
{
printf("=WSAStartup failed with error %d\n", Ret);
return;
}
if( (ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
//创建服务器端流式套接字,需用TCP协议
{
printf("socket failed with error d\n,WAGetLastError()");
//得到错误信息
WSACleanup();//清理
return;
}
ServerAddr.sin_family = AF_INET;
//套接;inter net协议
ServerAddr.sin_port = htons(Port);
//本机字节转化为网络字节
ServerAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//不限制客户端IP
if ((bind(ListeningSocket, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr))) == SOCKET_ERROR)
{
printf("bind failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
//设置监听,队列中最多有5个排列
if ((listen(ListeningSocket,5))==SOCKET_ERROR)
{
printf("listen failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
printf("We are waiting a connection on port %d:\n",Port);
printf("liten(正在监听)...\n");
ClientAddrLen = sizeof(SOCKADDR);
if((NewConnect=accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen))==INVALID_SOCKET)
{
printf("accept failed with error %d\n", WSAGetLastError());
closesocket(ListeningSocket);
WSACleanup();
return;
}
printf("We successfully got a connect from %s: %d\n", inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port));
closesocket(ListeningSocket);//在强大就不用关闭
printf("We are waiting to receive data \n");
if ((Ret=recv(NewConnect, DataBufer,sizeof( DataBufer), 0)) == SOCKET_ERROR)
{
printf("recv failed with error %d\n", WSAGetLastError());
closesocket(NewConnect);
WSACleanup();
return;
}
printf("We successfully receive %d bytes\n", Ret);
DataBufer[Ret] = '\0';
printf("%s\n",DataBufer);
printf("We are now going to close the client connection\n");
closesocket(NewConnect);
WSACleanup();
return;
system("pause");
}
4、运行以上代码,找到运行出的exe文件,将其复制到c盘的新建的文件夹中
客户端
Socket->connect->send/recv->close
创建过程
1、2如同服务端的1、2。
3、注释掉上面的内容,输入下列工程代码
程序代码如下:
#pragma comment(lib,"ws2_32.lib")
#include<WinSock2.h>
#include<stdio.h>
#include<stdlib.h>
void main(int argc, char**argv)
{
WSADATA wsData;
int Ret;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 5555;
if (argc<=1)
{
printf("USAGE:TCP客户端<Server IP address>\n");
//system("pause");
return;
}
if ((Ret=WSAStartup(MAKEWORD(2,2),&wsData))!=0)
{
printf("=WSAStartup failed with error %d\n", Ret);
return;
}
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
{
printf("socket failed with error d\n,WAGetLastError()");
WSACleanup();
return;
}
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
printf("We are trying to connect to %s:%d\n", inet_ntoa(ServerAddr.sin_addr), htons(ServerAddr.sin_port));
if (connect(s, (SOCKADDR*)&ServerAddr, sizeof(ServerAddr)) == SOCKET_ERROR)
{
printf("connect failed with error %d\n", WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}
printf("Our connect succeeded\n");
printf("We will now try to send a hello message\n");
if ((Ret=send(s,"hello",5,0))==SOCKET_ERROR)
{
printf("send failed with error %d\n", WSAGetLastError());
closesocket(s);
WSACleanup();
return;
}
printf("We successfully send %d bytes\n", Ret);
printf("We are closing the connect\n");
closesocket(s);
WSACleanup();
return;
system("pause");
}
4、运行以上代码,找到运行出的exe文件,将其复制到c盘的新建的文件夹中
5、打开运行窗口输入以下命令运行TCP服务器
cd\
cd 你的exe文件所在的文件夹
6、在打开一个运行窗口口输入一下命令
cd\
cd 你的exe文件所在的文件夹 设备的IP
只要是获取本机IP都可以输入127.0.0.1
