在本次中,学习了一个简单的基于TCP/IP的服务器/客户端。在例子中,利用的是AF_INET域。在linux下,最常用就是AF_INET,AF_UNIX. AF_UNIX是linux文件系统实现的本地要借字。后面的是可以用于包括英特网在内的TCP/IP网络通信的程序。
下面来看一个简单的基于TCP/IP的程序例子:
#include <iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
using namespace std;
//一个简单的客户端程序
int main()
{
int sockfd;
int len;
struct sockaddr_in address;
int result;
char ch = 'A';
//创建一个套接字
sockfd = socket(AF_INET , SOCK_STREAM , 0);
//根据服务器的情况给套接子命名
// address.sun_family = AF_UNIX;
// strcpy(address.sun_path , "server_socket");
address.sin_family = AF_INET;
address.sin_addr.s_addr = inet_addr("127.0.0.1");
address.sin_port = 7777;
len = sizeof(address);
//将我们的套接字连接到服务器的套接字
result = connect(sockfd , (struct sockaddr*)&address , len);
if(result == -1){
perror("oops: client1");
exit(1);
}
//现在可以对套接字进行读写操作啦
write(sockfd , &ch , 1);
read(sockfd , &ch , 1);
printf("char from server= %c\n" , ch);
close(sockfd);
return 0;
}
服务器端:
#include <iostream>
#include<sys/types.h>
#include<sys/socket.h>
#include<stdio.h>
#include<sys/un.h>
#include<unistd.h>
#include<stdlib.h>
#include<netinet/in.h>
#include<arpa/inet.h>
using namespace std;
int main()
{
int server_sockfd , client_sockfd;
int server_len , client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
//删除以前的套接字,wier服务器创建一个未命名的套接字
unlink("server_socket");
server_sockfd =socket(AF_INET , SOCK_STREAM , 0);
//命令套接子:
// server_address.sun_family = AF_UNIX;
// strcpy(server_address.sun_path , "server_socket");
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = 7777;
server_len = sizeof(server_address);
bind(server_sockfd , (struct sockaddr*)&server_address , server_len);
//创建一个连接列队,开始等待客户端进行连接
listen(server_sockfd , 5);
while(1){
char ch;
printf("server waiting\n");
//接受一个连接
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd , (struct sockaddr*)&client_address , (socklen_t*)&client_len);
//对client_sockfd套接字进行读写操作
read(client_sockfd , &ch , 1);
ch++;
write(client_sockfd , &ch , 1);
close(client_sockfd);
}
return 0;
}