目录
◎解析代码◎
Socket_demo _tcp
实验路径**~/Socket_exp/Socket_demo$ 实验环境 - Linux
ser.c - 建立socket服务器
//头文件:stdio.hstdlib.h
string.hunistd.h
sys/types.hsys/socket.h
netinet/in.h arpa/inet.h
errno.h
//定义端口号:PORT - ( 0 - 65535 ) - 1024以下端口号保留预定义服务
1.创建Socket
int socket_fd = socket( AF_INET , SOCK_STREAM , 0 )
if( socket_fd == -1 )
{
printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
//OR perror("socket failed");
exit(-1);
}
2.准备通信地址
struct sockaddr_in seraddr; //创建结构体
memset( &seraddr , 0 , sizeof(seraddr) ); //初始化结构体
seraddr.sin_family = AF_INET;
seraddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址设置INADDR_ANY,自动获取本机IP
//OR inet_aton("192.168.182.10", &seraddr.sin_addr); //手动设置IP地址
seraddr.sin_port = htons( PORT ); //设置端口为 PORT
3.Socket addr 绑定
int bind_res = bind( socket_fd , (struct sockaddr *)&seraddr , sizeof(seraddr) );
if( bind_res == -1 )
{
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
//OR perror("bind failed");
exit(-1);
}
4.监听端口
int listen_res = listen( socket_fd , 10 );
if( listen_res == -1 )
{
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
//OR perror("listen failed");
exit(-1);
}
printf("======waiting for client's request======\n");
5.处理接受客户端的连接请求
int connect_fd ;
struct sockaddr_in fromaddr;
memset( &fromaddr, 0 , sizeof(fromaddr) ); //初始化结构体
socklen_t len = sizeof(fromaddr);
begin:connect_fd = accept( socket_fd , (struct sockaddr*)fromaddr , &len );
if( connect_fd == -1 )
{
perror("accept failed");
continue; //阻塞直到有客户端连接,节省CPU资源
}
while(true)
{
//6.处理客户端数据
}
6.处理客户端数据
while(true)
{
//6.处理客户端数据
char buf[4096] = {0};
char *str = "Hello,you are connected!\n";
int count = recv( connect_fd , buf , sizeof(buf) , 0 );
if( !fork() )
{
if(send(connect_fd, str , strlen(str) ,0) == -1) perror("send error");
close(connect_fd);
exit(0);
}
if(count == 0 ){printf("The client is dead\n");goto begin;}
printf("有一个客户端连接到服务器,它是:%s\n", inet_ntoa(fromaddr.sin_addr));
buf[count] = '\0';
printf("从客户端读取到%d字节:%s\n",count, buf);
}
close(connect_fd);
close(socket_fd);
return 0;
cli.c - 建立socket客户端
//头文件:stdio.hstdlib.h
string.hunistd.h
sys/types.hsys/socket.h
netinet/in.h arpa/inet.h
errno.h
//定义端口号:PORT - ( 0 - 65535 ) - 1024以下端口号保留预定义服务
// - int main( int argc , char** argv ) 带参执行main
int i_port = 8000; //默认8000端口
char *c_ipAddr = “127.0.0.1”;
if( argc == 1)
{
printf("This client will connect server message: IP=127.0.0.1 , Port=8000 \n");
}
else if( argc ==2 )
{
c_ipAddr = argv[1];
printf("This client will connect server message: IP=%s , Port=8000 \n",c_ipAddr);
}
else if( argc == 3)
{
c_ipAddr = argv[1];
i_port = atoi(argv[2]);
printf("This client will connect server message: IP=%s,Port=%d \n",c_ipAddr, i_port);
}
else
{
printf("usage: ./client <ipaddress> and port \n");
exit(-1);
}
1.创建Socket
·同服务器端
2.准备通信地址
struct sockaddr_in seraddr; //创建结构体
memset( &seraddr , 0 , sizeof(seraddr) ); //初始化结构体
seraddr.sin_family = AF_INET;
/*设置为服务器进程的端口号*/
seraddr.sin_port = htons(i_port); //设置端口为 PORT
/*服务器所在主机IP地址*/
if( inet_pton(AF_INET, c_ipAddr, &seraddr.sin_addr) <= 0){
printf("inet_pton error for %s\n",argv[1]);
exit(-1);
}
3.连接服务器
if( connect(socket_fd, (struct sockaddr*)&seraddr, sizeof(seraddr)) < 0){
printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
exit(-1);
}
printf("连接服务器成功....\n");
4.和服务器交换数据 - Then Close
printf("send msg to server: \n");
char recvline[4096], sendline[4096] , buf[4096];
int rec_len;
fgets(sendline, 4096, stdin);
if( send(socket_fd, sendline, strlen(sendline), 0) < 0)
{
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit(-1);
}
if((rec_len = recv(socket_fd, buf, 4096,0)) == -1) {
perror("recv error");
exit(-1);
}
buf[rec_len] = '\0';
printf("Received : %s ",buf);
close(socket_fd);
exit(0);
OR 4.和服务器交换数据 - Then Close
char buf[100] = {0};
char *str = "hello...";
write(sockfd, str, strlen(str)) ;
read(sockfd, buf, sizeof(buf));
printf("服务器说:%s\n", buf);
close(sockfd);
return 0;
实例编写: Linux服务器Windows客户端通信基于TCP
附件:Linux_ser.c VS2015_cli.cpp