首页 技术 正文
技术 2022年11月18日
0 收藏 845 点赞 5,034 浏览 2546 个字

源代码:http://download.csdn.net/detail/nuptboyzhb/4169959

基于TCP/IP协议的网络编程

定义变量——获得WINSOCK版本——加载WINSOCK库——初始化——创建套接字 ——设置套接字选项——关闭套接字——卸载WINSOCK库——释放所有资源

整个程序架构分为两大部分,服务器端客户端。

服务器SOCKET程序流程:

socket()→bind()→listen→accept()→recv()/send()→closesocket()

客户端:

socket→bind()→connect()→send()/recv()→closesocket()

编程举例:

约定发送消息的格式为如下结构体:

typedef struct

{

int ID;

char data[255];

}TcpMessage;

应用程序的头文件如下:

#include <winsock2.h>

#pragma comment(lib,”ws2_32″)

#include <stdio.h>

端口号为:4500

服务器端:

1、  初始化:

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if(WSAStartup(sockVersion, &wsaData) != 0)

return 0;

2、  创建套接字:

SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sListen == INVALID_SOCKET)

{

printf(“socket error\n”);

return 0;

}

3、  使套接字和本地地址绑定

// 在sockaddr_in结构中装入地址信息

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(4500); // htons函数将主机的无符号短整形数转换成网络

//字节顺序

sin.sin_addr.S_un.S_addr = INADDR_ANY;

if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)

{

printf(” bind error \n”);

closesocket(sListen);

return 0;

}

4、监听端口

if(listen(sListen, 5) == SOCKET_ERROR)

{

printf(“listen error\n”);

closesocket(sListen);

return 0;

}

5、等待接受连接,(如无连接,一直等待)

SOCKET sClient;//用于保存accept返回的套接字

sClient = accept(sListen,0,0);//accept函数调用失败则继续等待连接。

if(sClient == INVALID_SOCKET)

{

printf(“accept() error”);

}

6、用第5步中accept函数返回的套接字进行收发通信

6.1、接收:(如果没有接到,会等待!)

TcpMessagerevData;//定义接收消息的结构体变量

int ret=recv(sClient,(char *)&revData,sizeof(revData),0);

if(ret>0)//说明,收到字节

{

switch (revData.ID)//对不同的ID,可以有不同的反应

{

case 1:

……..

case 2:

……..

}

}

6.2、发送:

TcpMessage sendData;

memset((char*)&sendData,0,sizeof(sendData));//初始化为0

sendData.ID=1;//为ID成员变量赋值

strcpy(sendData.data,”\r\n..要发送的字符信息 “);

if(send(sClient,(char*)&sendData,sizeof(sendData),0)==SOCKET_ERROR)

{

char error[10];

int errorcode=WSAGetLastError();

itoa(errorcode,error,10);

MessageBox(NULL,error,”发送失败,错误码为:”,MB_OK);

printf(“send error!”);

}

7、关闭

closesocket(sClient);//由accept生成的套接字

closesocket(sListen);//服务端套接字

WSACleanup();

客户端

1、   初始化

WSADATA wsaData;

WORD sockVersion = MAKEWORD(2, 2);

if(WSAStartup(sockVersion, &wsaData) != 0)

return 0;

2、   创建套接字

SOCKET sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if(sClient == INVALID_SOCKET)

{

printf(“socket error\n”);

return 0;

}

3、   使套接字和本地地址绑定

// 在sockaddr_in结构中装入服务器端地址信息

sockaddr_in servAddr;

servAddr.sin_family = AF_INET;

servAddr.sin_port = htons(4500);// htons函数将主机的无符号短整形数转换成网络

//字节顺序,4500端口为要连接服务器端的端口

servAddr.sin_addr.S_un.S_addr =inet_addr(“127.0.0.1”);//服务器端ip

4、   连接服务器

if(connect(sClient,(sockaddr*)&servAddr,sizeof(servAddr))==SOCKET_ERROR)

{

printf(“connect error\n”);

closesocket(sClient);

return 0;

}

//注意,要先把服务器打开,否则连接失败

5、   收发通信

用send和recv函数,这一点和服务器端一样

6、   关闭

closesocket(sClient);//客户端只有一个连接套接字

WSACleanup();

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,406
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898