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 1024int 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;
}