TCP程序設計
下面的一幅圖是取自《UNIX網絡編程卷一》,這個簡單的C/S程序的框架,應該可以一下很容易看懂。

下面是我寫的一個例子:
服務端:
/*
tcp_server.c
*/
#include <stdio.h>
#include <stdlib.h>
#include < string.h>
#include <netdb.h>
#include <sys/types.h>
#include <errno.h>
#include <netinet/ in.h>
#include <sys/socket.h>
#define portnumber 3333
int main( int argc, char * argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
char buffer[ 1024];
// 創建sockfd描述符,AF_INET代表IPv4,SOCK_STREAM代表TCP
if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == - 1)
{
fprintf(stderr, " socket error %s ",strerror(errno));
exit( 1);
}
// 服務器填充sockaddr結構
bzero(&server_addr, sizeof( struct sockaddr_in)); // 初始化,置0。
server_addr.sin_family = AF_INET;
// 將本機器上的long數據轉化為網絡上的long數據
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// 將本機的short數據轉化為網絡上的short數據
server_addr.sin_port = htons(portnumber);
// 捆綁sockfd描述符到IP地址
if (bind(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr)) == - 1)
{
fprintf(stderr, " bind error %s\n\a ",strerror(errno));
exit( 1);
}
// 設置允許的最大客戶端連接數
if (listen(sockfd, 5) == - 1)
{
fprintf(stderr, " listen error %s\n\a ",strerror(errno));
exit( 1);
}
while( 1)
{
// 服務器阻塞知道客戶程序建立連接
sin_size == sizeof( struct sockaddr_in);
if ((new_fd = accept(sockfd,( struct sockaddr *)(&client_addr),&sin_size)) == - 1)
{
fprintf(stderr, " accept error %s\n\a ",strerror(errno));
exit( 1);
}
fprintf(stderr, " server get connection from %s\n\a ",inet_ntoa(client_addr.sin_addr));
if ((nbytes = read(new_fd,buffer, 1024)) == - 1)
{
fprintf(stderr, " read error %s \a\n ",strerror(errno));
exit( 1);
}
buffer[nbytes] = ' \0 ';
printf( " server received %s\n ",buffer);
close(new_fd);
}
exit( 0);
}
客戶端:
/*
tcp_client.c
*/
#include <stdio.h>
#include < string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#define portnumber 3333
int main( int argc, char *argv[])
{
int sockfd;
char buffer[ 1024];
struct sockaddr_in server_addr;
struct hostent * host;
if (argc != 2)
{
fprintf(stderr, " Usage: %s hostname\a\n ",argv[ 0]);
exit( 1);
}
if ((host = gethostbyname(argv[ 1])) == NULL)
{
fprintf(stderr, " gethostname error \n\a ");
exit( 1);
}
// 客戶端開始建立sockfd描述符
if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == - 1)
{
fprintf(stderr, " scoket error %s\a\n ",strerror(errno));
exit( 1);
}
bzero(&server_addr, sizeof(server_addr)); // 初始化,置0.
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber); // 將本機的short數據轉化為網絡的short數據
server_addr.sin_addr = *(( struct in_addr *)host->h_addr);
// 客戶程序發起連接請求
if (connect(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr)) == - 1)
{
fprintf(stderr, " connect error %s\a\n ",strerror(errno));
exit( 1);
}
// 連接成功
printf( " Please input char:\n ");
// 發送數據
fgets(buffer, 1024,stdin);
write(sockfd,buffer,strlen(buffer));
// 結束通訊
close(sockfd);
exit( 0)}
tcp_client.c
*/
#include <stdio.h>
#include < string.h>
#include <stdlib.h>
#include <errno.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ in.h>
#define portnumber 3333
int main( int argc, char *argv[])
{
int sockfd;
char buffer[ 1024];
struct sockaddr_in server_addr;
struct hostent * host;
if (argc != 2)
{
fprintf(stderr, " Usage: %s hostname\a\n ",argv[ 0]);
exit( 1);
}
if ((host = gethostbyname(argv[ 1])) == NULL)
{
fprintf(stderr, " gethostname error \n\a ");
exit( 1);
}
// 客戶端開始建立sockfd描述符
if ((sockfd = socket(AF_INET,SOCK_STREAM, 0)) == - 1)
{
fprintf(stderr, " scoket error %s\a\n ",strerror(errno));
exit( 1);
}
bzero(&server_addr, sizeof(server_addr)); // 初始化,置0.
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber); // 將本機的short數據轉化為網絡的short數據
server_addr.sin_addr = *(( struct in_addr *)host->h_addr);
// 客戶程序發起連接請求
if (connect(sockfd,( struct sockaddr *)(&server_addr), sizeof( struct sockaddr)) == - 1)
{
fprintf(stderr, " connect error %s\a\n ",strerror(errno));
exit( 1);
}
// 連接成功
printf( " Please input char:\n ");
// 發送數據
fgets(buffer, 1024,stdin);
write(sockfd,buffer,strlen(buffer));
// 結束通訊
close(sockfd);
exit( 0)}