TCP Client网络编程基本步骤
- 创建socket,指定使用TCP协议
- 使用connect连接服务器
- 使用recv/send接收/发送数据关闭socket
TCP-connect连接请求
!man 2 connect
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
功能:
给服务器发送客户端的连接请求
参数:
sockfd:文件描述符,socket函数的返回值
addr:要连接的服务器的网络信息结构体(需要自己设置)
addrlen:add的长度
返回值:
成功:0
失败:-1
注意:
connect建立连接之后不会产生新的套接字
连接成功后才可以开始传输TCP数据
头文件:#include
代码实现
#include <stdio.h>
#include <cstring>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <arpa/inet.h>
#define PORT 8888
#define MESSAGE_LEN 1024
int main(int argc,char* argv[]){
int ret=-1;
int socket_fd;
struct sockaddr_in serveraddr;
char sendbuf[MESSAGE_LEN]={0,};
char recvbuf[MESSAGE_LEN]={0,};
socket_fd=socket(AF_INET,SOCK_STREAM,0);
if(socket_fd<0){
std::cout<<"Failed to create socket!"<<std::endl;
exit(-1);
}
serveraddr.sin_family=AF_INET;//地址族
serveraddr.sin_port=htons(PORT);//端口号
serveraddr.sin_addr.s_addr=inet_addr("127.0.0.1");//这里将字符串转换成整型
ret=connect(socket_fd,
(struct sockaddr *)&serveraddr,
sizeof(sockaddr));
if(ret < 0){
std::cout<<"Failed to connect server!"<<std::endl;
exit(-1);
}
std::cout<<"connect success!"<<std::endl;
while(1){
memset(sendbuf,0,MESSAGE_LEN);
fgets(sendbuf,sizeof(sendbuf),stdin);//输入
ret = send(socket_fd,sendbuf,strlen(sendbuf),0);//发送
if(ret <= 0){
std::cout<<"Failed to send data!"<<std::endl;
break;
}
if(strcmp(sendbuf,"quit")==0){
break;
}
ret = recv(socket_fd,recvbuf,MESSAGE_LEN,0);//接收数据
recvbuf[ret]='\0';
std::cout<<"recv:"<<recvbuf<<std::endl;//输出
}
close(socket_fd);
return 0;
}