葡京网投哪个正规 > 首页 > TCP小聊天具体代码实现,基于TCP的程序设计和基于UDP的程序设计

原标题:TCP小聊天具体代码实现,基于TCP的程序设计和基于UDP的程序设计

浏览次数:108 时间:2020-03-25

第14课 网络编程
1.TCP流式套接字的编程步骤
在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!
服务器端程序:
1、加载套接字库
2、创建套接字(socket)。
3、将套接字绑定到一个本地地址和端口上(bind)。
4、将套接字设为监听模式,准备接收客户请求(listen)。
5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
6、用返回的套接字和客户端进行通信(send/recv)。
7、返回,等待另一客户请求。
8、关闭套接字。
客户端程序:
1、加载套接字库
2、创建套接字(socket)。
3、向服务器发出连接请求(connect)。
4、和服务器端进行通信(send/recv)。
5、关闭套接字。
服务器端代码如下:
#include <Winsock2.h>//加裁头文件
#include <stdio.h>//加载标准输入输出头文件

原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang

 网络编程可分为基于TCP的网络程序设计和基于UDP的网络程序设计。TCP是基于字节流的面向连接的,常用于可靠的网络传输,而UDP是基于数据报的无连接的网络传输,常用语即时通信。

void main()
{
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;

1.       创建一个简单的SOCKET编程流程如下

    无论是基于TCP或者是基于UDP的程序设计,它都是有固定的步骤可循的。只要理解这些步骤,实现起来也是比较简单的。下面将介绍基于TCP和UDP的网络编程的详细步骤以及实现实例。

//TCPserver:

wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字

面向有连接的套接字编程

    在介绍网络编程之前,首先要说明一点:Winsock函数是Windows提供的网络编程的借口,无论是基于TCP的还是UDP的网络编程,在程序设计之前,都要首先加载Winsock库。

#include<Winsock2.h>

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
   return;
}//加载套接字库,加裁失败则返回

服务器:

一、基于TCP的网络应用程序

#include<stdio.h>

if ( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion ) != 1 ) {
   WSACleanup( );
   return;
}//如果不是1.1的则退出
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。

1)  创建套接字(socket)

    网络应用程序都是基于C/S(客户端/服务器)模式的,因此在进行网络应用程序开发时,不仅要开发服务器应用程序也要开发客户端应用程序。开发服务器应用程序和客户端应用程序在步骤上略有不同。下面介绍一下基于TCP的网络应用程序开发的详细步骤:

void main()

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

2)  将套接字绑定到一个本地地址和端口上(bind)

服务器端应用程序:                                                                  客户端应用程序:

{

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//将套接字绑定到一个本地地址和端口上(bind)
listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求(listen)。

3)  将套接字设定为监听模式,准备接受客户端请求(listen)

1、创建socket套接字                                                                1、创建socket套接字

WORD wVersionRequested;

SOCKADDR_IN addrClient;//定义地址族
int len=sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化

4)  等待客户端请求到来,当请求到来后,接受连接请求,返回一个新的对应于此连接的套接字(accept)

2、将套接字绑定(bind)到指定的本机IP地址和端口上           

WSADATA wsaData;

while(1)
{
   SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);accept的第三个参数一定要有初始值。
//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。
//此时程序在此发生阻塞
   char sendBuf[100];
   sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",
    inet_ntoa(addrClient.sin_addr));
//用返回的套接字和客户端进行通信(send/recv)。
   send(sockConn,sendBuf,strlen(sendBuf)+1,0);
   char recvBuf[100];
   recv(sockConn,recvBuf,100,0);
   printf("%sn",recvBuf);
   closesocket(sockConn);//关闭套接字。等待另一个用户请求
}
}

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

3、将套接字设为监听模式(listen),准备接受客户端的请求                   2、向服务器发送连接请求(connect)

int err;

客户端代码如下:
#include <Winsock2.h>
#include <stdio.h>

6)  返回,等待另一个客户端请求

4、等待客户端请求的到来(accept),并返回新的套接字进行通信

wVersionRequested=MAKEWORD(1,1);

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

7)  关闭套接字

5、服务器和客户端相互通信(send/recv)                                         3、服务器和客户端相互通信(send/recv) 

err=WSAStartup(wVersionRequested,&wsaData);

wVersionRequested = MAKEWORD( 1, 1 );

客户端:

6、返回继续等待新的客户端请求到来

if(err!=0)

err = WSAStartup( wVersionRequested, &wsaData );加载套接字库
if ( err != 0 ) {
   return;
}

1)  创建套接字(socket)

7、关闭socket套接字                                                                  4、关闭socket套接字

{

if ( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion ) != 1 ) {
   WSACleanup( );
   return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);创建套接字(socket)。

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

注释:服务器要绑定端口,监听客户端请求,当接受到请求后才开始通信。而客户端只需要先发送请求,只要请求被接收后就可以通信了。

return ;

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));向服务器发出连接请求(connect)。

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

在理解示例代码之前,先介绍一些知识点和函数:

}

char recvBuf[100];和服务器端进行通信(send/recv)。
recv(sockClient,recvBuf,100,0);
printf("%sn",recvBuf);
send(sockClient,"This is lisi",strlen("This is lisi")+1,0);

4)  关闭套接字

第一点:在网络编程中,要用到IP地址和端口号,比如在bind()和accept()函数中都需要有到IP地址和端口号,在Windows API中有一个SOCKADDR_IN结构体中可以保存IP地址和端口号的信息。

if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)

closesocket(sockClient);关闭套接字。
WSACleanup();//必须调用这个函数清除参数
}

面向无连接的套接字编程

第二点:服务器要绑定的IP地址应该用(INADDR_ANY)属性,表示服务器可以接受任何端口发送来的连接请求,这是因为有的机器可能有多个网卡,因此可能有多个IP地址,这样设定可以方便后面的程序开发。

{

2.UDP型套接字。
服务器端(接收端)程序:
1、创建套接字(socket)。
2、将套接字绑定到一个本地地址和端口上(bind)。
3、等待接收数据(recvfrom)。
4、关闭套接字。
客户端(发送端)程序:
1、创建套接字(socket)。
2、向服务器发送数据(sendto)。
3、关闭套接字。
服务器端代码:
#include <Winsock2.h>
#include <stdio.h>

服务器:(接收端)

第三点:网络通信中用到的是网络字节序,intel的机器本机字节序和网络字节序的存放格式是不一样的,所以要用想用的函数进行转化。

WSACleanup();

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

1)       创建套接字(socket)

inet_addr()将点分十进制的IP地址转化为u_long型

return;

wVersionRequested = MAKEWORD( 1, 1 );

2)       将套接字绑定到一个本地地址和端口上(bind)

inet_ntoa()将in_addr结构类型的参数转化为点分十进制的IP地址

}

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
   return;
}

3)       用返回的套接字和客户端进行通信(recvfrom);

htonl()将u_long型的IP地址从主机字节序转换为网络字节序

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

if ( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion ) != 1 ) {
   WSACleanup( );
   return;
}

4)       关闭套接字

htons()将u_short型的IP地址从主机字节序转换为网络字节序

SOCKADDR_IN addrSrv;

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

客户端:(发送端)

第四点:网络编程要用到Winsock库,,所以不仅要加载winsock的头文件,并且要绑定ws2_32.lib动态链接库。绑定动态链接库有两种方法。第一种就是在工程的“属性”里设置“Link”的链接库加上ws2_32.lib就可以了。第二种方法就是在工程的源文件中加上代码:#pragma comment(lib,"ws2_32.lib")就可以了。

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

1)  创建套接字(socket)

 /**************************************************************
                       基于TCP的服务器应用程序示例代码
 ****************************************************************/

addrSrv.sin_family=AF_INET;

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];

2)  向服务器发送数据(sendto

#include "stdafx.h"
#include <stdlib.h>
#include <Winsock2.h>
#include <stdio.h>
void main()
{
 /**************************************************************
                       加载Winsock库
 ****************************************************************/
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
 {
  return;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
  HIBYTE( wsaData.wVersion ) != 1 )
 {
   WSACleanup( );
   return;
 }
 /**************************************************************
                  第一步:创建Winsock套接字
 ****************************************************************/
 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);
 /**************************************************************
           第二步:将创建的套接字绑定到本地地址和端口上
 ****************************************************************/
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
 
 bind(sockSrv,(const sockaddr*)&addrSrv,sizeof(SOCKADDR));
 /**************************************************************
     第三步:将套接字设置为监听模式,准备接受客户端的请求
 ****************************************************************/
 listen(sockSrv,5);
 /**************************************************************
     第四步:接受客户端的请求
  第五步:接收客户端的消息和向客户端发送消息
  第六步:返回等待
  第七步:关闭套接字
 ****************************************************************/
 SOCKADDR_IN addrClient;
 int len=sizeof(SOCKADDR);
 while(1)
 {
  SOCKET sockCon=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
  char sendBuf[100];
  sprintf(sendBuf,"This is server,Welcome%s",inet_ntoa(addrClient.sin_addr));
  send(sockCon,sendBuf,strlen(sendBuf)+1,0);
  char recvbuf[100];
  recv(sockCon,recvbuf,strlen(recvbuf)+1,0);
  printf("%sn",recvbuf);
  closesocket(sockCon);
 }
 system("PAUSE");
}

addrSrv.sin_port=htons(6000);

recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);
printf("%sn",recvBuf);
closesocket(sockSrv);
WSACleanup();
}

3)  关闭套接字

/**************************************************************
                       基于TCP的客户端应用程序示例代码
 ****************************************************************/

bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));

客户端代码:
#include <Winsock2.h>
#include <stdio.h>

例如:面向有连接的套接字编程

#include "stdafx.h"
#include <stdlib.h>
#include <Winsock2.h>
#include <stdio.h>
void main()
{
 /**************************************************************
                       加载Winsock库
 ****************************************************************/
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
 {
  return;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
  HIBYTE( wsaData.wVersion ) != 1 )
 {
   WSACleanup( );
   return;
 }
 /**************************************************************
                  第一步:创建Winsock套接字
 ****************************************************************/
 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
 /**************************************************************
                  第二步:向服务器发送连接请求
 ****************************************************************/
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
 connect(sockClient,(const sockaddr*)&addrSrv,sizeof(SOCKADDR));
 /**************************************************************
                  第三步:客户端和服务器的相互通信
 ****************************************************************/
 char recvbuf[100];
 recv(sockClient,recvbuf,strlen(recvbuf)+1,0);
 printf("%s",recvbuf);
 send(sockClient,"My name is zhangsan Client",strlen("My name is zhangsan Client")+1,0);
 closesocket(sockClient);

listen(sockSrv,5);

void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

 

 WSACleanup();

SOCKADDR_IN addrClient;

wVersionRequested = MAKEWORD( 1, 1 );

首先在项目菜单,工程属性->VC++目录->库目录中添加 ws2_32.lib

 system("PAUSE");

int len=sizeof(SOCKADDR);

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
   return;
}

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

}

printf("等待连接……n");

if ( LOBYTE( wsaData.wVersion ) != 1 ||
         HIBYTE( wsaData.wVersion ) != 1 ) {
   WSACleanup( );
   return;
}

注意一定包含头文件是小写的 winsock2.h  开头的w要小写,不然整死你了

先运行服务器程序再运行客户端程序,运行结果如下:

while(1)

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);

客户端:

葡京网投哪个正规 1

{

sendto(sockClient,"Hello",strlen("Hello")+1,0,
   (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
}
UDP的不再加注释了。因为它比TCP的简单多了。
3.基于字符界面的聊天程序,用的是UDP式套接字。代码略。
4.如何添加新的工程?
首先选择中Build工具栏,然后在工程管理器上点击右键,选择增加新的工程即可。

#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

二、基于UDP的网络应用程序

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

#include<stdio.h>

上面介绍了基于TCP的网络应用程序,为了便于比较,下面介绍基于UDP的网络应用程序的设计方法。

bool flag= 1;

int main()

和上面一样,先接受基于UDP的网络应用程序的开发步骤:

while(flag)

{

服务器端应用程序:                                                                  客户端应用程序:

{

        

1、创建socket套接字                                                                1、创建socket套接字

char recvBuf[100];

         //第一步:加载socket库函数

2、将套接字绑定(bind)到指定的本机IP地址和端口上                          2、向服务器发送消息(sendto)

recv(sockConn,recvBuf,100,0);

         //**********************************************************

3、如果检测到有消息到来就接收消息(recvfrom)

if(recvBuf[0]=='q')

         WORD wVersionRequested;

4、关闭socket套接字                                                                 3、关闭socket套接字     

{

         WSADATA wsaData;

注释:由于基于UDP的网络应用程序是面向无连接的,所以不需要服务器的监听,也不需要客户端的连接请求。实现起来比TCP的面向连接的简单,适用于即时通信。主要用到的函数和方法和TCP的设计方法大致一样。示例代码如下:

flag=0;

         int err;

/**************************************************************
                       基于UDP的服务器应用程序示例代码
 ****************************************************************/

closesocket(sockConn);

        

#include "stdafx.h"
#include <stdlib.h>
#include <Winsock2.h>
#include <stdio.h>

continue;

         wVersionRequested = MAKEWORD( 1, 1 );

#pragma comment(lib,"ws2_32.lib")
void main()
{
 /**************************************************************
                       加载Winsock库
 ****************************************************************/
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
 {
  return;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
  HIBYTE( wsaData.wVersion ) != 1 )
 {
   WSACleanup( );
   return;
 }
 /**************************************************************
             第一步:创建Winsock套接字
 ****************************************************************/
 SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
 /**************************************************************
             第二步:将创建的套接字绑定到指定地址和端口上
 ****************************************************************/
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);
 bind(sockSrv,(const sockaddr*)&addrSrv,sizeof(SOCKADDR));
 /**************************************************************
             第三步:等待并接受客户端发送的消息
 ****************************************************************/
 SOCKADDR_IN addrClient;
 char recvBuf[100];
 int len=sizeof(SOCKADDR);
 recvfrom(sockSrv,recvBuf,100,0,(sockaddr*)&addrClient,&len);
 printf("%s",recvBuf);
 char sendBuf[100];
 sprintf(sendBuf,"This is UDP Serve! Welcome %s",inet_ntoa(addrClient.sin_addr));
 sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,
  (const sockaddr*)&addrClient,sizeof(SOCKADDR));
 closesocket(sockSrv);

}

        

 WSACleanup();
 system("pause");
}

printf("client : %sn",recvBuf);

         err = WSAStartup( wVersionRequested, &wsaData );

/**************************************************************
                       基于UDP的客户端应用程序示例代码
 ****************************************************************/

char sendBuf[100];

        

#include "stdafx.h"
#include <stdlib.h>
#include <Winsock2.h>
#include <stdio.h>

printf("server : ");

         if ( err != 0 ) {                           

#pragma comment(lib,"ws2_32.lib")
void main()
{
 /**************************************************************
                       加载Winsock库
 ****************************************************************/
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 )
 {
  return;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
  HIBYTE( wsaData.wVersion ) != 1 )
 {
   WSACleanup( );
   return;
 }
 /**************************************************************
             第一步:创建Winsock套接字
 ****************************************************************/
 SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);
 /**************************************************************
             第一步:向服务器发送消息
 ****************************************************************/
 SOCKADDR_IN addrClient;
 addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
 addrClient.sin_family=AF_INET;
 addrClient.sin_port=htons(6000);
 sendto(sockClient,"My name is UDP Client!",strlen("My name is UDP Client!")+1,0,
  (const sockaddr*)&addrClient,sizeof(SOCKADDR));
 char recvBuf[100];
 int len=sizeof(SOCKADDR);
 recvfrom(sockClient,recvBuf,100,0,(sockaddr*)&addrClient,&len);
 printf("%s",recvBuf);
 closesocket(sockClient);
 WSACleanup();

gets(sendBuf);

                   return 0;

 system("pause");
}

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

         }

运行结果如下:

}

        

葡京网投哪个正规 2

}

         if ( LOBYTE( wsaData.wVersion ) != 1 ||

<script type=text/javascript> if ($ != jQuery) { $ = jQuery.noConflict(); } var isLogined = false; var cb_blogId = 96439; var cb_entryId = 2208677; var cb_blogApp = "chengfeng736"; var cb_blogUserGuid = "1dbb9853-fbd5-e011-8ee0-842b2b196315"; var cb_entryCreatedDate = '2011/10/12 15:13:00'; </script> 摘自:乘风736

}

        HIBYTE( wsaData.wVersion ) != 1 ) {

...

//TCPclient

                   WSACleanup( );

#include<Winsock2.h>

                   return 0;

#include<stdio.h>

         }

void main()

         //**********************************************************

{

         //第一步,创建套接字

WORD wVersionRequested;

         SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0) ;

WSADATA wsaData;

        

int err;

         //定义套接字地址

wVersionRequested = MAKEWORD(1,1);

         SOCKADDR_IN addrSrv;

err = WSAStartup(wVersionRequested,&wsaData);

         addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");  //获取服务器IP地址,inet_addr()将IP地址转为点分十进制的格式

if(err!=0)

        

return;

         addrSrv.sin_family = AF_INET;

SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0);

         //sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_葡京正网网投,INET

SOCKADDR_IN addrSrv;

        

addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

         addrSrv.sin_port = htons(1234);

addrSrv.sin_family = AF_INET;

        

addrSrv.sin_port = htons(6000);

         //连接服务器

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

         //      connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

printf("对话开始:n");

        

while(1)

         if(connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR))!=0)

{

         {

char recvBuf[100];

                   //MessageBox("连接失败");

printf("client : ");

                   //return;

gets(recvBuf);

                   printf("error");

send(sockClient,recvBuf,strlen(recvBuf)+1,0);

                   return 0;

if('q'==recvBuf[0])

         }else

{

         {

closesocket(sockClient);

                   printf("success");

WSACleanup();

         }

break;

        

}

         char recvBuf[100];

recv(sockClient,recvBuf,100,0);

         recv(sockClient,recvBuf,100,0);

printf("server : %sn",recvBuf);

         printf("客户端接收到的数据:%s",recvBuf);

}

         send(sockClient,"client send ",strlen("client send ")+1,0);

}

         //关闭套接字

葡京网投哪个正规 3

         closesocket(sockClient);

         //清除套接字资源

         WSACleanup();        

         return 0;

        

}

 

 

服务器端:

#include<Winsock2.h>

#include<stdio.h>

int main()

{

        

         //第一步:加载socket库函数

         //**********************************************************

         WORD wVersionRequested;

         WSADATA wsaData;

         int err;

        

         wVersionRequested = MAKEWORD( 1, 1 );

        

         err = WSAStartup( wVersionRequested, &wsaData );

        

         if ( err != 0 ) {                           

                   return 0;

         }

        

         if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

                   WSACleanup( );

                   return 0;

         }

         //**********************************************************

        

         //第二步创建套接字

         SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);

        

         //第三步:绑定套接字

        

         //获取地址结构

         SOCKADDR_IN addrSrv;

        

        

         addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);

         //将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接收数据

         //htonl()将主机的无符号长整形数转换成网络字节顺序。

        

        

         addrSrv.sin_family = AF_INET;

         //sin_family 表示地址族,对于IP地址,sin_family成员将一直是AF_INET

        

        

         addrSrv.sin_port = htons(6000);

         //htons()将主机的无符号短整形数转换成网络字节顺序

        

         bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

        

         //监听客户端

         listen(sockSrv,5);

        

         //定义从客户端接受的地址信息

         SOCKADDR_IN addrClient ;

         int len = sizeof(SOCKADDR);

        

        

         while(1)

         {

                   //不断等待客户端的请求的到来,并接受客户端的连接请求

                   printf("等待客户连接n");

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

                   char sendBuf[100];

                   sprintf(sendBuf,"welcome %s to wuhan",inet_ntoa(addrClient.sin_addr));

                   printf("发送数据n");

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

                   char recvBuf[100];

                   printf("等待接受数据n");

                   recv(sockConn,recvBuf,100,0);

                   printf("%sn",recvBuf);

                   closesocket(sockConn);

                  

         }

         WSACleanup();

        

         return 0;

        

}

 

 

 

面向无连接的套接字编程

例子:

客户端:

 

#include "Winsock2.h"

#include "stdio.h"

 

int main()

{

                   //第一步:加载socket库函数

         //**********************************************************

         WORD wVersionRequested;

         WSADATA wsaData;

         int err;

        

         wVersionRequested = MAKEWORD( 1, 1 );

        

         err = WSAStartup( wVersionRequested, &wsaData );

 

         if ( err != 0 ) {                           

                   return 0;

         }

        

         if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

                   WSACleanup( );

                   return 0;

         }

 

 

         //创建套接字

         SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0);

         SOCKADDR_IN sockSrv;

         sockSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

         sockSrv.sin_family = AF_INET ;

         sockSrv.sin_port = htons(6000);

 

         sendto(sockClient,"hello",strlen("hello")+1,0,(SOCKADDR*)&sockSrv,sizeof(SOCKADDR));

         closesocket(sockClient);

         WSACleanup();

         return 0;

}

 

 

服务器:

#include "Winsock2.h"

#include "stdio.h"

 

int main()

{

                   //第一步:加载socket库函数

         //**********************************************************

         WORD wVersionRequested;

         WSADATA wsaData;

         int err;

        

         wVersionRequested = MAKEWORD( 1, 1 );

        

         err = WSAStartup( wVersionRequested, &wsaData );

 

         if ( err != 0 ) {                           

                   return 0;

         }

        

         if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

                   WSACleanup( );

                   return 0;

         }

 

 

         //创建套接字

         SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM,0);

         SOCKADDR_IN addSrv;

         addSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

         addSrv.sin_family = AF_INET ;

         addSrv.sin_port = htons(6000);

 

         bind(sockSrv,(SOCKADDR*)&addSrv,sizeof(SOCKADDR));

 

         SOCKADDR_IN addrClient;

         int len = sizeof(SOCKADDR);

         char recvBuf[葡京网投哪个正规,100];

        

         recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);

         printf("%sn",recvBuf);

         closesocket(sockSrv);

         WSACleanup();

         return 0;

}

本文由葡京网投哪个正规发布于首页,转载请注明出处:TCP小聊天具体代码实现,基于TCP的程序设计和基于UDP的程序设计

关键词:

上一篇:没有了

下一篇:静态存储区和常量存储区,栈及静态数据区详解