Socket编程--基础(基本server/client实现)
- IPv4套接口地址结构
- IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件中
- LINUX结构下的常用结构,一般创建套接字的时候都要将这个结构里面的值进行初始化
struct sockaddr_in
{
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order(网络字节序) */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr
{
uint32_t s_addr; /* address in network byte order */
};
- socket函数
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol); //创建一个套接字用于通信 参数分析
domain:指定通信协议族(protocol family),常用取值AF_INET(IPv4)
type:指定socket类型, 流式套接字SOCK_STREAM,数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW
protocol:协议类型,常用取值0, 使用默认协议
返回值:
成功: 返回非负整数,套接字;
失败: 返回-1
- bind函数
intbind(intsockfd,conststructsockaddr *addr, socklen_t addrlen); //addrlen--地址长度绑定一个本地地址到套接字。绑定函数
参数:
sockfd:socket函数返回的套接字
addr:要绑定的地址
- listen函数
int listen(int sockfd, int backlog);
listen函数应该用在调用socket和bind函数之后, 并且用在调用accept之前, 用于将一个套接字从一个主动套接字转变成为被动套接字。
使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。 sockfd 一个已绑定未被连接的套接字描述符
backlog说明:
对于给定的监听套接口,内核要维护两个队列:
1、已由客户发出并到达服务器,服务器正在等待完成相应的TCP三路握手过程(SYN_RCVD状态)
2、已完成连接的队列(ESTABLISHED状态)
但是两个队列长度之和不能超过backlog
- accept函数
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); sockfd:服务器套接字
addr:将返回对等方的套接字地址, 不关心的话, 可以设置为NULL
addrlen:返回对等方的套接字地址长度, 不关心的话可以设置成为NULL, 否则一定要初始化
- connect函数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen); 建立一个连接至addr所指定的套接字
参数:
sockfd:未连接套接字
addr:要连接的套接字地址
addrlen:第二个参数addr长度
- inet_aton
- 将一个字符串的ip地址字节转换成了一个一个32位的网络序列IP地址
int inet_aton(const char *string, struct in_addr*addr); string是表示的是要转换的字符串ip地址,后面的是网络序列ip地址
成功返回非0,不成功返回-1
- 将一个字符串的ip地址字节转换成了一个一个32位的网络序列IP地址
- 客户端和服务器端练习(server\client)
- 分别建立两个工程,一个server,一个client。然后先打开服务端,再打开客户端进行测试,源代码如下。
//服务器端
#pragma comment(lib,"ws2_32.lib")
#include<iostream>
#include<winsock2.h>
#include<string>
#include<stdio.h>
using namespace std; int main(){
//创建套接字
WORD myVersionRequest;
WSADATA wsaData; //包含系统所支持的winsocket版本信息
myVersionRequest = MAKEWORD(, ); //初始化版本1.1
int err;
err = WSAStartup(myVersionRequest, &wsaData); if (!err){
cout << "已经打开套接字" << endl;
}
else{
//进一步绑定套接字
cout << "套接字未打开" << endl;
return ;
} //创建可识别套接字 调用socket函数
SOCKET serSocket = socket(AF_INET, SOCK_STREAM, ); //需要绑定的参数
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//ip地址
addr.sin_port = htons();//绑定端口 //将套接字绑定到指定的网络地址
bind(serSocket, (SOCKADDR*)&addr, sizeof(SOCKADDR));//绑定完成
//监听连接
listen(serSocket, ); //第二个参数代表能够接受的最多的连接数
//建立客户端的连接
SOCKADDR_IN clientsocket;
int len = sizeof(SOCKADDR);
SOCKET serConn;
//等待客户端的连接
serConn = accept(serSocket, (SOCKADDR*)&clientsocket, &len); //返回一个数字 接受函数,不是-1就是接受连接成功
cout << "客户端" << inet_ntoa(clientsocket.sin_addr) << "已连接" << endl; //客户端已连接 while () {
char sendBuf[]; //发送的字节
sprintf_s(sendBuf, "server : welcome %s to server.", inet_ntoa(clientsocket.sin_addr)); //转换函数,将二进制的ip序列转换成char数组
//在对应的IP处并且将这行字打印到那里
send(serConn, sendBuf, strlen(sendBuf) + , );
char receiveBuf[]; //收到的字节
//接收客户端传来的信息
recv(serConn, receiveBuf, strlen(receiveBuf) + , );
char* quit = "quit";
//如果客户端传来了quit信号,则服务端关闭,客户端也关闭
if (!strcmp(receiveBuf, quit)) {
break;
}
printf("%s\n", receiveBuf);
} closesocket(serConn); //关闭
WSACleanup(); //释放资源的操作
}//客户端
#pragma comment(lib,"ws2_32.lib")
#include<winsock2.h>
#include<iostream>
#include<string>
#include<conio.h>
using namespace std;
int main(){ WORD versionRequired;
WSADATA wsaData; //包含系统所支持的WinStock版本信息
versionRequired = MAKEWORD(, ); //初始化版本1.1
int err;
//注册WinStock,返回状态
err = WSAStartup(versionRequired, &wsaData);//协议库的版本信息
if (!err) { //返回结果为0表示初始化失败{
cout << LPSTR("客户端套接字已经打开!\n");
}
else{
//调用WSAGetLastError()查看错误信息
cout << ("客户端套接字打开失败:") << WSAGetLastError() << endl;
return ;//结束
}
/*
创建套接字:
流式套接字: SOCK_STREAM , IPPROTO_TCP
数据报套接字: SOCK_DGRAM , IPPROTO_UDP
*/ SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建流式套接字
SOCKADDR_IN clientsock_in; //专门针对Internet 通信域的Winsock地址结构
clientsock_in.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //通过inet_addr结构指定套接字的主机IP地址
clientsock_in.sin_family = AF_INET; //指定协议家族:AF_INET
clientsock_in.sin_port = htons(); //指定将要分配给套接字的传输层端口号:6000 //开始连接
int fail = connect(clientSocket, (SOCKADDR*)&clientsock_in, sizeof(SOCKADDR));
if (fail){
cout << "与服务端连接失败!程序将退出..." << endl;
_getch();
return ;
}
string s;
while (cin >> s){
char receiveBuf[];
//接收数据
recv(clientSocket, receiveBuf, , );
cout << receiveBuf << endl;
//发送数据
send(clientSocket, s.c_str(), s.length() + , );
if (s == "quit"){
break;
}
}
closesocket(clientSocket);//关闭套接字 if (WSACleanup() == SOCKET_ERROR){
cout << "套接字关闭失败:" << WSAGetLastError() << endl;
}
else{
cout << "套接字成功关闭." << endl;
}
_getch();
return ;
} 程序运行截图

- 分别建立两个工程,一个server,一个client。然后先打开服务端,再打开客户端进行测试,源代码如下。
Socket编程--基础(基本server/client实现)的更多相关文章
- socket编程基础-字节序/IP/PORT转换/域名
socket编程基础 网络IP操作函数 字符串的IP和32位的IP转换 #include <sys/socket.h> #inlcude <netinet/in.h> #inc ...
- 一个linux下socket编程的例子,client连server
关于socket编程,以下文章写得比较好:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 1. accept()函 ...
- c#socket编程基础
Microsoft.Net Framework为应用程序访问Internet提供了分层的.可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类 ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- java socket编程基础(转)
一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- 【转】Java Socket编程基础及深入讲解
原文:https://www.cnblogs.com/yiwangzhibujian/p/7107785.html#q2.3.3 Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要 ...
- 【Socket】Java Socket编程基础及深入讲解
Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...
- 你得学会并且学得会的Socket编程基础知识
这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblog ...
- 【socket编程基础模板】
网络编程的基础是基于socket编程.socket(TCP)编程基于固定编程模板 server端: socket(声明socket类型) bind(命令socket,绑定地址和端口) listen(创 ...
随机推荐
- python_根据"词库"进行“词联想”
输入法中,当你输入一个字的时候,输入法就能猜出你要输入什么词.这就是词联想.现在,再python中简单实现类似这样的功能:根据制定好的词库,输入一个新的词,帮助实现词联想.其中分词用了jieba包. ...
- Mycat 在vscode中的开发配置
mycat是国产目前最被追捧的一款分布式数据库集群软件,有一些公司对数据库和应用都有自己的集群方案,但是更多的是一些面对庞大的数据量,而束手无策. 对于这种问题,我想百分之80遇到的是数据库的瓶颈,所 ...
- CODE FESTIVAL 2017 qual A--C - Palindromic Matrix(模拟所有情况,注意细节)
个人心得:其实本来这题是有规律的不过当时已经将整个模拟过程都构思出来了,就打算试试,将每个字符和总和用优先队列 装起来,然后枚举每个点,同时进行位置标志,此时需要多少个点的时候拿出最大的和出来,若不满 ...
- LeetCode 340. Longest Substring with At Most K Distinct Characters
原题链接在这里:https://leetcode.com/problems/longest-substring-with-at-most-k-distinct-characters/ 题目: Give ...
- [转]【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解
小编:对于互联网,域名是访问的第一跳,而这一跳很多时候会“失足”,导致访问错误内容,失败连接等,让我们在互联网上畅游的爽快瞬间消失,而对于这关键的第一跳,鹅厂也在持续深入研究和思考对策,今天小编就邀请 ...
- CF 19E Fairy——树上差分
题目:http://codeforces.com/contest/19/problem/E 去掉一条边,使无向图变成二分图. 该边应该被所有奇环经过,且不被偶环经过. 因为一条非树边一定只在一个环里. ...
- 8、Selenium+python安装HTMLTestRunner插件
1.打开网址:http://tungwaiyip.info/software/HTMLTestRunner.html,下载HTMLTestRunner.py 2.copy其HTMLTestRunner ...
- FMDB是iOS平台的SQLite数据库框架
1.FMDB简介 什么是FMDBFMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 为什么使用FMDB使用起来更加面向对象,省去了很多麻烦.冗余的C语言 ...
- spring中JavaConfig相关的注解
在spring3.0中增加配置spring beans的新方式JavaConfig,可以替换spring的applicataion.xml配置.也即@Configuration对等<beans/ ...
- Web项目安全相关博客日志大集合(仅供学习及参考)
强制使用HTTPS --- Tomcat篇 ---通过在tomcat/conf/web.xml中进行配置,从而将http自动转为https.(即强制HSTS)http://blog.csdn.net/ ...