1. 程式人生 > >Linux網路程式設計之TCP程式設計

Linux網路程式設計之TCP程式設計

直接上程式碼如下所示:

1、標頭檔案定義

#ifndef __HEAD_NET_H__
#define __HEAD_NET_H__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 8888
#define SRV_IP "192.168.7.3"
#define N 5
#define SIZE 1024

#define p_error(str) ({\
	perror(str);\
	exit(1);})


#endif

2、伺服器端程式碼

#include "head_net.h"

int main(int argc,char **argv)
{
    int sock_fd,conn_fd;
    struct sockaddr_in sin,cin;
    socklen_t len;
    char cli_ip[16];
    char buf[SIZE];
    int ret;

    /*1:建立socket*/
    //if( (sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
    sock_fd = socket(AF_INET,SOCK_STREAM,0);
    if(sock_fd < 0) 
	p_error("socket");	

    int on = 1;
    if(setsockopt(sock_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on)) < 0)
	p_error("setsockopt");
    /*2:繫結地址*/
    bzero(&sin,sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(SRV_IP);
    
    if(bind(sock_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	p_error("bind");
    /*3:監聽*/
    if(listen(sock_fd,N) < 0)
	p_error("listen");
    /*4:連線,三次握手*/
    printf("stat connect!\n");
    len = sizeof(cin);
    if( (conn_fd = accept(sock_fd,(struct sockaddr*)&cin,&len))<0)
	p_error("accept");
    strcpy(cli_ip,inet_ntoa(cin.sin_addr));
  
    /*5:通訊*/
    while(1){
	bzero(buf,SIZE);
	if( (ret = read(conn_fd,buf,SIZE)) < 0)
	    p_error("read");
	else if(0 == ret){
	    close(sock_fd);
	    break;
	}
	if(strncmp(buf,"quit",4) == 0)
	    break;
	printf("%s:%s",cli_ip,buf);
    }   

    /*6:關閉socket*/
    shutdown(conn_fd,2);
    return 0;
}

3、客戶端程式碼

#include "head_net.h"

int main(int argc,char **argv)
{
    int conn_fd;
    struct sockaddr_in sin;
    char buf[SIZE];

    /*1:建立socket*/
    if( (conn_fd = socket(AF_INET,SOCK_STREAM,0)) < 0) 
     p_error("socket");	

    /*2:建立連線,三次握手*/

    bzero(&sin,sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_port = htons(PORT);
    sin.sin_addr.s_addr = inet_addr(SRV_IP);
   

    if( connect(conn_fd,(struct sockaddr*)&sin,sizeof(sin)) < 0)
	p_error("connect");

    /*3:通訊*/

    do{
	bzero(buf,SIZE);
	fgets(buf,SIZE,stdin);
	if(write(conn_fd,buf,strlen(buf)) < 0)
		p_error("write");
    }while(strncmp(buf,"quit",4) != 0);

    /*4:關閉socket*/
    close(conn_fd);
    return 0;
}