Linux下的TCP通信
今天我们介绍如何编写Linux下的TCP程序,关于UDP程序我还没学。
服务器端的步骤如下:
1. socket: 建立一个socket
2. bind: 将这个socket绑定在某个文件上(AF_UNIX)或某个端口上(AF_INET),我们会分别介绍这两种。
3. listen: 开始监听
4. accept: 如果监听到客户端连接,则调用accept接收这个连接并同时新建一个socket来和客户进行通信
5. read/write:读取或发送数据到客户端
6. close: 通信完成后关闭socket
客户端的步骤如下:
1. socket: 建立一个socket
2. connect: 主动连接服务器端的某个文件(AF_UNIX)或某个端口(AF_INET)
3. read/write:如果服务器同意连接(accept),则读取或发送数据到服务器端
4. close: 通信完成后关闭socket
下面贴出我的首个套接字代码,客户端输入一串字符串,服务端返回新的字符串。
server.cpp
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
/*create a socket*/
int server_sockfd = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
server_addr.sin_port=htons(9527);
/*bind*/
bind(server_sockfd,(struct sockaddr *)&server_addr,sizeof(server_addr));
/*listen*/
listen(server_sockfd,5);
int client_sockfd;
struct sockaddr_in client_addr;
socklen_t len=sizeof(client_addr);
while(1)
{
char *ch = new char;
printf("server waiting:\n");
/*accept a connection*/
client_sockfd=accept(server_sockfd,(struct sockaddr *)&client_addr,&len);
/*exchange data*/
read(client_sockfd,ch,1024);//I don't know the length of ch from client,so I give bigger length.
cout<<"get string from client:"<<ch<<endl;
strcat(ch,"aaa");
write(client_sockfd,ch,strlen(ch));
cout<<"after write:"<<ch<<endl;
close(client_sockfd);
delete ch;
}
return 0;
}
client.cpp
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
/*create a socket*/
int client_sock = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in client_addr;
client_addr.sin_family=AF_INET;
client_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
client_addr.sin_port=htons(9527);
/*connect to server*/
int result=connect(client_sock,(struct sockaddr *)&client_addr,sizeof(client_addr));
if(result == -1)
{
perror("connect failed.");
exit(1);
}
/*exchange data*/
char *ch = new char;
cin>>ch;
write(client_sock,ch,strlen(ch));
read(client_sock,ch,strlen(ch)+100);//the length of ch may be changed by server program,so we should offer bigger length;
cout<<"get string from server:"<<ch<<endl;
/*close socket*/
close(client_sock);
return 0;
}
以上内容部分摘自 http://blog.youkuaiyun.com/gaotong2055/article/details/8768795