Window TCP 服务端
- 注意事项
- 引入windows.h头文件
- 引入ws2_32.lib网络库
#include <windows.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
void createTcpSocket()
{
//初始化Socket
WSADATA ws;
WSAStartup(MAKEWORD(2,2),&ws);
/**
创建socket
SOCKET socket(int af,int type,int protocal);
af 表示一个网络地址类型,通常为AF_INET,表示套接字在Internet域中通信。
type:表示套接字类型。如果为SOCK_STREAM,表示流式套接字,如果为SOCK_DGRAM,表示数据报套接字。
protocal:表示网络协议,通常为0,表示采用TCP/IP协议。
**/
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==-1){
printf("create socket failed!\n");
return -1;
}
short port=9800;
//sockaddr_in 描述服务端描述,如端口、IP、地址族
sockaddr_in saddr;
saddr.sin_family = AF_INET; //地址族
//htons函数将本地字节序转网络字节序
saddr.sin_port = htons(port); //设置端口号
//绑定IP地址,0表示所有网卡都作为TCP监听。
saddr.sin_addr.s_addr = htonl(0);
//绑定端口等信息
if(::bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0) {
//绑定端口失败
printf("bind port %d failed!\n",port);
return -2;
}
printf("bind port %d success!\n",port)
//告诉操作系统可以监听客户端的连接
/**
int listen(int sockfd, int backlog);
第一个参数sockfd为创建socket返回的文件描述符。
第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度
**/
listen(sock,10);
//读取客户端的连接信息
sockaddr_in caddr;
socklen_t len=0;
int clientSock=accept(sock,(sockaddr*)&caddr,&len);
printf("accept client %d\n",clientSock);
//inet_ntoa 函数是将结构转ip字符串
char *ip=inet_ntoa(caddr.sin_addr);
unsigned short cport=ntohs(caddr.sin_port);
//读取客户端数据
char buf[1024]={0};
int recvlen= recv(clientSock,buf,sizeof(buf)-1,0);
//发生消息
send(clientSock,"ok",3,0);
//关闭socket
closesocket(sock);
}
Linux TCP 服务端
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>
//atoi
#include <stdlib.h>
//htonl
#include <arpa/inet.h>
#include <string.h>
void createSocket()
{
/**
创建socket
SOCKET socket(int af,int type,int protocal);
af 表示一个网络地址类型,通常为AF_INET,表示套接字在Internet域中通信。
type:表示套接字类型。如果为SOCK_STREAM,表示流式套接字,如果为SOCK_DGRAM,表示数据报套接字。
protocal:表示网络协议,通常为0,表示采用TCP/IP协议。
**/
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==-1){
printf("create socket failed!\n");
return -1;
}
short port=9800;
//sockaddr_in 描述服务端描述,如端口、IP、地址族
sockaddr_in saddr;
saddr.sin_family = AF_INET; //地址族
//htons函数将本地字节序转网络字节序
saddr.sin_port = htons(port); //设置端口号
//绑定IP地址,0表示所有网卡都作为TCP监听。
saddr.sin_addr.s_addr = htonl(0);
//绑定端口等信息
if(::bind(sock,(sockaddr*)&saddr,sizeof(saddr))!=0) {
//绑定端口失败
printf("bind port %d failed!\n",port);
return -2;
}
printf("bind port %d success!\n",port)
//告诉操作系统可以监听客户端的连接
/**
int listen(int sockfd, int backlog);
第一个参数sockfd为创建socket返回的文件描述符。
第二个参数backlog为建立好连接处于ESTABLISHED状态的队列的长度
**/
listen(sock,10);
//读取客户端的连接信息
sockaddr_in caddr;
socklen_t len=0;
int clientSock=accept(sock,(sockaddr*)&caddr,&len);
printf("accept client %d\n",clientSock);
//inet_ntoa 函数是将结构转ip字符串
char *ip=inet_ntoa(caddr.sin_addr);
unsigned short cport=ntohs(caddr.sin_port);
//读取客户端数据
char buf[1024]={0};
int recvlen= recv(clientSock,buf,sizeof(buf)-1,0);
//发生消息
send(clientSock,"ok",3,0);
//关闭socket
close(sock);
}
C++线程
#include <thread>
class TcpThread{
public:
void Main()
{
}
int clientSock;
}
void createThread()
{
TcpThread *th=new TcpThread();
//创建线程
thread sth(&TcpThread::Main,th);
//拆分子线程与主线程关系
sth.detach();
}
Makefile
tcpserver:main.cpp
g++ main.cpp -o tcpserver -std=c++11 -lpthread
网友评论