Linux C 网络编程——4. 容易TCP Socket程序
Linux C 网络编程——4. 简单TCP Socket程序
根据图中的流程,实现一个最简单的TCP程序。
1. 客户端
功能:发送一个字符串给服务器
/* ============================================================================ Name : SimpleSockTCPClient.c Author : wistone Version : Copyright : 2012 - 2015 Description : Simple Socket Client ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> int main( int argc, char** argv ) { struct sockaddr_in server_addr_in; char buf[100]; int cfd; int port = 8001; char *str = "test string"; if( argc > 1 ) { str = argv[1]; } cfd = socket( AF_INET, SOCK_STREAM, 0 ); bzero( &server_addr_in, sizeof(server_addr_in) ); server_addr_in.sin_family = AF_INET; server_addr_in.sin_port = htons(port); inet_pton( AF_INET, "127.0.0.1", &server_addr_in.sin_addr ); connect( cfd, (struct sockaddr *)&server_addr_in, sizeof(server_addr_in) ); send( cfd, str, strlen(str)+1, 0 ); //write( cfd, str, strlen(str)+1 ); //read(cfd, buf, 100); recv( cfd, buf, 100, 0 ); close(cfd); printf("Recive from server : %s \n", buf); return 0; }
2. 服务器
把收到的字符串转成大写,然后发回去
/* ============================================================================ Name : SimpleSockTCPServer.c Author : wistone Version : Copyright : 2012 - 2015 Description : Simple Socket Server ============================================================================ */ #include <stdio.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/socket.h> int main( int argc , char ** argv ) { struct sockaddr_in saddr, caddr; char buf[100] ; char str[100] ; int listenfd, connfd; int addr_len; listenfd = socket( AF_INET, SOCK_STREAM, 0 ); memset ( &saddr, 0, sizeof(saddr) ); memset( buf, 0, 100 ); memset( buf, 0, 100 ); saddr.sin_family = AF_INET; saddr.sin_port = htons( 8001 ); saddr.sin_addr.s_addr = htonl( INADDR_ANY ); //any address bind( listenfd, (struct sockaddr *)&saddr, 16 ); listen( listenfd, 20 ); printf( "Accepting connections ... \n" ); int i, n; while(1) { addr_len = sizeof( caddr ); connfd = accept( listenfd, (struct sockaddr*)&caddr, &addr_len ); //n = read( listenfd, buf, 100 ); n = recv( listenfd, buf, 100, 0 ); printf("Recive from %s : %d \n", inet_ntop( AF_INET, &caddr.sin_addr, str, sizeof(str) ), ntohs(caddr.sin_port) ); for(i=0; i<n; i++) { buf[i] = toupper( buf[i] ); } //write( connfd, buf, n+1 ); send( connfd, buf, n+1, 0 ); printf("Send : %s \n", buf); close( connfd ); } return 0; }
3. 参考
[1] Linux C编程一站式学习
[2] Linux 网络编程