TCP/IP网络编程学习之路二
来源:互联网 发布:网络脱口秀节目排行榜 编辑:程序博客网 时间:2024/06/15 05:39
基于Windows下的网络编程:
网络编程基本上都有服务器端和客户端,这两个端所实现的方法是不一样的。
服务器端的一般框架
- 用socket()函数创建一个套接字,并建立资源所使用的资源 SOCKET socket(int af,int type,int protocol)
- 用bind()函数绑定套接字,并为其分配IP 地址和端口号 int PASCAL FAR bind( SOCKET s,const struct sockaddr FAR *name,int namelen )
- 用listen()函数监听是否有客户端想连接 int PASCAL FAR listen( SOCKET s, int backlog )
- 用accept()函数来接收客户端的连接请求, 同时创建一个新的套接字来和客户端通信 SOCKET PASCAL FAR accept(SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen);
- 用socket()函数创建一个套接字,并建立资源所使用的资源 SOCKET socket(int af,int type,int protocol)
- 用connect()函数来连接服务器int PASCAL FAR connect( SOCKET s,const struct sockaddr FAR *name,int namelen );
接下来解释函数参数的意思
SOCKET PASCAL FAR socket( int af,int type,int protocol );
af 表示套接字中使用的协议族信息, type表示套接字的类型(面向连接的或者面向无连接的),protocol表示计算机间通信中使用的协议信息(一般写0);
int PASCAL FAR bind( SOCKET s,const struct sockaddr FAR *name,int namelen );
s 是socket()函数创建的套接字 name 是Socket的位址值,其格式为 struct sockaddr { u_short sa_family; char sa_data[14]; }; namelen 是name的长度
int PASCAL FAR listen( SOCKET s, int backlog );
s是socket()函数创建的套接字, backlog是最多允许的连接数。
SOCKET PASCAL FAR accept(SCOKET s,struct sockaddr FAR *addr,int FAR *addrlen);
s 是socket()函数创建的套接字, addr 存放来连接的彼端的位址; addrlen addr的长度,这个函数会返回新的套接字!
int PASCAL FAR connect( SOCKET s,const struct sockaddr FAR *name,int namelen );
s是客户端通过socket()函数创建的套接字,name 是此 Socket 想要连接的对方位址 namelen 是name的长度;
服务器的基本框架
#include <iostream>#include <WinSock2.h>#include <cstdlib>#include <cstring>#pragma comment(lib, "ws2_32.lib")using namespace std;const int MAXLENGTH = 4096;int main(){WSADATA wsaData;int result = WSAStartup(MAKEWORD(2,2), &wsaData);if(result != NO_ERROR){cerr << "init winsock failured" << endl;exit(1);}SOCKET serversocket;serversocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(serversocket == INVALID_SOCKET){cout << "建立socket失败" << WSAGetLastError() << endl;system("pause");return -1;}sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr("127.0.0.1");server.sin_port = htons(6800);result = bind(serversocket, (struct sockaddr *)&server, sizeof(server));if(result == SOCKET_ERROR){cout << "绑定失败" << endl;system("pause");return -1;}result = listen(serversocket, 5);if(result == SOCKET_ERROR){cout << "监听失败" << endl;system("pause");return -1;}char recvbuf[1024];struct sockaddr_in client;int length =sizeof(client);SOCKET acceptsock = accept(serversocket, (struct sockaddr *)&client, &length);if(acceptsock == INVALID_SOCKET){cout << "接受失败" << endl;system("pause");return -1;}result = recv(acceptsock, recvbuf, strlen(recvbuf), 0);if(result == SOCKET_ERROR){cout << "接收失败" << endl;system("pause");return -1;}cout << recvbuf << endl;cin >> recvbuf;result = send(acceptsock, recvbuf, strlen(recvbuf), 0);if(result == SOCKET_ERROR){cout << "发送失败" << endl;system("pause");return -1;}closesocket(acceptsock);closesocket(serversocket);WSACleanup();system("pause");return 0;}
#include <iostream>#include <WinSock2.h>#include <cstring>#pragma comment(lib, "ws2_32.lib")using namespace std;int main(){WSADATA wsaData;int ret = WSAStartup(MAKEWORD(2,2), &wsaData);if(ret != 0){cout << "初始化win失败" << endl;system("pause");return -1;}SOCKET clientsocket;clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if(clientsocket == SOCKET_ERROR){cout << "创建socket失败" << endl;system("pause");return -1;}struct sockaddr_in server;server.sin_family = AF_INET;server.sin_addr.s_addr = inet_addr("127.0.0.1");server.sin_port = htons(6800);ret = connect(clientsocket, (struct sockaddr *)&server, sizeof(server));if(ret == SOCKET_ERROR){cout << "连接失败" << GetLastError() << endl;system("pause");return -1;}char buffer[1024];cin >> buffer;ret = send(clientsocket, buffer, strlen(buffer), 0);if(ret == SOCKET_ERROR){cout << "发送失败" << GetLastError() << endl;system("pause");return -1;}ret = recv(clientsocket, buffer, strlen(buffer), 0);if(ret == SOCKET_ERROR){cout << "接收失败" << GetLastError() << endl;system("pause");return -1;}cout << buffer << endl;closesocket(clientsocket);WSACleanup();system("pause");return 0;}
- TCP/IP网络编程学习之路二
- TCP/IP网络编程学习之路一
- TCP/IP网络编程学习之路三
- Linux学习(二十七):TCP/IP网络编程之本地通信
- TCP/IP网络编程之TCP
- TCP/IP网络编程之TCP
- Qt网络编程—TCP/IP(二)
- TCP/IP 网络编程(二)
- TCP/IP网络编程 --摘要二
- TCP/IP网络编程(二)
- 《TCP/IP网络编程》二、构建网络服务
- Linux网络编程之tcp/ip编程
- Java学习笔记之网络编程(二):TCP
- 学习网络协议(二)TCP/IP
- TCP/IP网络协议学习笔记二
- 初步学习网络编程tcp/ip (一)
- TCP/IP网络编程学习笔记
- TCP/IP网络编程之四书五经
- vim 配置
- 11.19
- 51nod 1649 齐头并进 (djikstra求最短路径,只用跑一次)
- fjnuoj1193 布置会场( 快速幂 矩阵)
- opencv-图像抠图
- TCP/IP网络编程学习之路二
- 剔除重复数据
- 刷题蓝桥杯(java)---Huffman树
- 数据库的操作
- Bailian2888 字符串中的数字【字符串】
- 信任的机制——区块链
- maven的setting配置文件中mirror和repository的区别
- Goland软件使用教程(一)
- 关系R的运算