socket编程续

news/2024/5/17 18:00:14 标签: socket, 服务器, stream, 编程, tcp, 网络

 在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。
服务器编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

以下是服务器端代码如下(VC项目应建立在windows控制台模式下的应用程序):

#include <stdio.h>
#include <Winsock2.h>
void main()
{
 WORD wVersionRequested;              //版本号
 WSADATA wsaData;                        //启动SOCKET的
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );//建立版本
 
 err = WSAStartup( wVersionRequested, &wsaData );//启用socket
 if ( err != 0 ) //如果返回值不等于0,那么表示出错,直截退出程序
{
  return;
}
 
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);    //设置为TCP流模式

 SOCKADDR_IN addrSrv;                                                        //
 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);            //INADDR_ANY为本机任意IP
 addrSrv.sin_family=AF_INET;                                                //
 addrSrv.sin_port=htons(6000);                                                //侦听端口为6000
 
 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));    //绑定到SOCKET
 listen(sockSrv, 5);                                    //侦听sockSrv,并设置最大客户连接数为5。

 SOCKADDR_IN addrClient;           
 int len=sizeof(SOCKADDR);
 while(1)
 {
  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); //等待客户连接,如果没有客户连接时,则此函数在这里会产生阻塞。
  char sendBuf[50];
  sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));
  send(sockConn,sendBuf,strlen(sendBuf)+1,0);    //发送sendBuf的字符串给客户端。
  char recvBuf[50];
  recv(sockConn,recvBuf,50,0);                                //从客户端接收50个字节。
  printf("%s/n",recvBuf);                                    //显示客户端发过来的字符串
  closesocket(sockConn);                                //关闭字
 }
 WSACleanup();                        //清理
}
很简单吧?呵呵。再复杂的使用TCP协议的网络通信程序也是基于此的。下面顺便也把客户端的程序写出来。相同部分的程序就不不注释了。

客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:向服务器发出连接请求(connect());
3:和服务器端进行通信(send()/recv());
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端的代码如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 
 wVersionRequested = MAKEWORD( 1, 1 );
 
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
  return;
 }
 
  SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
 
 SOCKADDR_IN addrSrv;
 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//设置SOCKET的IP为本机。
 addrSrv.sin_family=AF_INET;
 addrSrv.sin_port=htons(6000);//端口为6000,服务端和客户端的端口一定要相同.否则是连不上的
 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//根据addrSrv连接服务端
 char recvBuf[50];
 recv(sockClient,recvBuf,50,0);                        //接收50字符
 printf("%s/n",recvBuf);        //显示
 send(sockClient,"hello",strlen("hello")+1,0);    //发送一个hello
 
 closesocket(sockClient);            //关闭
 WSACleanup();                        //清理
}

对了,在这种模式叫做什么同步阻塞模式,遇到连接,发送,接受函数时,程序便会等待,直到完成操作,才会执行下面的程序段,所以一般这些网络操作都会开启一个新线程去完成,那样不会使程序的主线程阻塞。呵呵。容易吧?``


http://www.niftyadmin.cn/n/1536368.html

相关文章

后台参数验证的几种方式

前言 参数验证是一个常见的问题&#xff0c;无论是前端还是后台&#xff0c;都需对用户输入进行验证&#xff0c;以此来保证系统数据的正确性。对于web来说&#xff0c;有些人可能理所当然的想在前端验证就行了&#xff0c;但这样是非常错误的做法&#xff0c;前端代码对于用户…

[转帖]华为不想做下一个英特尔 但计算野心尽露

华为不想做下一个英特尔 但计算野心尽露 2019年09月19日 15:00 2021 次阅读 稿源&#xff1a;雷锋网 1 条评论https://www.cnbeta.com/articles/tech/891047.htm 华为全联接大会上&#xff0c;计算产品集中爆发&#xff0c;让人不禁想起早年任正非的一句话&#xff0c;“不敢干…

Windows SDK

微软每推出一个重要的windows版本&#xff0c;一般都会同时推出一个SDK&#xff08;Software Development Kit&#xff09;。SDK包含了开发该windows版本所需的windows函数和常数定义、API函数说明文档、相关工具和示例。SDK一般使用C语言&#xff0c;但不包括编译器。高版本VC…

[转帖]PostgreSQL 昨天,今天和明天

PostgreSQL 昨天,今天和明天 http://www.postgres.cn/v2/news/viewone/1/52 原作者&#xff1a;何伟平(laser) 创作时间&#xff1a;2005-01-15 11:44:2408 采编&#xff1a;doudou586 发布时间&#xff1a;2014-01-15 11:39:30 欢迎大家踊跃投稿&#xff0c;投稿信箱&#…

[转帖]Greenplum :基于 PostgreSQL 的分布式数据库内核揭秘 (上篇)

Greenplum &#xff1a;基于 PostgreSQL 的分布式数据库内核揭秘 (上篇) https://www.infoq.cn/article/3IJ7L8HVR2MXhqaqI2RA学长的文章.. 姚延栋阅读数&#xff1a;7142019 年 9 月 15 日 17:11 本文经授权转载自公众号 PostgreSQL 中文社区&#xff0c;主要介绍了 Greenplum…

Android JNI--基础篇(二)

编写一个可以与C代码交互的android工程需要如下步骤&#xff1a; 1、JAVA代码中写声明native 方法 2、 创建jni目录,编写c代码,方法名字要对应 3、编写Android.mk文件&#xff08;交叉编译的规范&#xff09; 4、Ndk编译生成动态库 5、Java代码load 动态库.调用native代码 具体…

[转帖]Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇)

Greenplum: 基于PostgreSQL的分布式数据库内核揭秘(下篇) http://www.postgres.cn/v2/news/viewone/1/454 原作者&#xff1a;姚延栋 创作时间&#xff1a;2019-05-08 17:25:2508 采编&#xff1a;wangliyun 发布时间&#xff1a;2019-05-09 08:25:28 欢迎大家踊跃投稿&…

Redis高可用——集群模式

Redis高可用——集群模式 一、Redis 群集模式二、集群的作用1.数据分区2.高可用 三、Redis集群的数据分片四、Redis集群的主从复制模型五、搭建Redis 群集模式1.创建每个redis节点的目录&#xff0c;复制需要的文件2.开启群集功能3.启动redis节点4.启动集群5.测试群集 一、Redi…