您的位置:首页 > 理论基础 > 计算机网络

tcp服务器与客户端

2016-08-15 16:17 351 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_35055713/article/details/52212215

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

 

 

 


 

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: