linux下運行的socket_tcp


服務端:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <string.h>

#define SRVIP "127.0.0.1"
#define SRVPORT 10005
#define MAX_NUM 80

/*********************
TCP socket通信
服務器端流程如下:
1.創建serverSocket
2.初始化 serverAddr(服務器地址)
3.將socket和serverAddr 綁定 bind
4.開始監聽 listen
5.進入while循環,不斷的accept接入的客戶端socket,進行讀寫操作write和read
6.關閉serverSocket
**********************/
int main()
{
    // 如果發生錯誤,函數返回值為-1。 否則,函數會返回一個代表新分配的描述符的整數
    int serverSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(serverSock < 0)
    {
        printf("socket creation failed\n");
        exit(-1);
    }
    printf("socket create successfully.\n");

    struct sockaddr_in serverAddr;
    memset(&serverAddr,0,sizeof(serverAddr));
    serverAddr.sin_family=AF_INET;
    serverAddr.sin_port = htons((u_short)SRVPORT);
    serverAddr.sin_addr.s_addr = inet_addr(SRVIP);

    // bind() 將一個socket綁定到指定的IP和端口上,socket只接受綁定IP和端口的數據
    if(bind(serverSock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr))==-1)
    {
        printf("Bind error.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);
        exit(-1);
    }
    printf("Bind successful.IP[%s], Port[%d]\n", SRVIP, serverAddr.sin_port);

    // 當socket和一個地址綁定之后,listen()函數會開始監聽可能的連接請求
    if(listen(serverSock,10)==-1)
    {
        printf("Listen error!\n");
    }
    printf("Listening on port[%d]\n", serverAddr.sin_port);

    char recvBuf[MAX_NUM]={0};
    char sendBuf[MAX_NUM]={0};
    while(1)
    {
        struct sockaddr clientAddr;
        int size = sizeof(clientAddr);

        //阻塞,直到有新tcp客戶端連接
        int clientSock = accept(serverSock, &clientAddr, &size);
        printf("***SYS***    New client touched.\n");
        while(1)
        {
            //一直接收客戶端socket的send操作
            if(recv(clientSock, recvBuf, MAX_NUM, 0) == -1)
            {
                printf("read error.\n");
            }
            else
            {
                printf("receiv from client:%s\n",recvBuf);
            }
            if(strcmp(recvBuf,"Quit") == 0 || strcmp(recvBuf,"quit") == 0)
            {
                strcpy(sendBuf, "Goodbye,my dear client!");
            }
            else
            {
                strcpy(sendBuf, "Hello Client.");
            }

            // 向客戶端發送套接字
            if(send(clientSock, sendBuf , sizeof(sendBuf), MSG_NOSIGNAL) == -1)
            {
                printf("Send error!\n");
            }
            else
            {
                printf("Send to client:%s\n", sendBuf);
            }
            if(strcmp(recvBuf, "Quit") == 0 || strcmp(recvBuf, "quit") == 0)
            {
                break;
            }
            memset(recvBuf, 0, sizeof(recvBuf));
            memset(sendBuf, 0, sizeof(sendBuf));
        }
        close(clientSock);
    }

    //關閉監聽socket
    close(serverSock);
    return 0;
}

 

 

客戶端:

 

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h> 
#include <netinet/in.h>
#include <errno.h>
#include <string.h>
#include   <unistd.h>
            
#define CLTIP "127.0.0.1"
#define SRVPORT 10005
#define MAX_NUM 80
    
/**************************
客戶端流程:

1.創建clientSocket
2.初始化 serverAddr
3.鏈接到服務器 connect
4.利用send和recv進行讀寫操作
5.關閉clientSocket
**************************/
int main()
{
    // 延遲1s
    //sleep(1000);

    // socket() 為通訊創建一個端點,為套接字返回一個文件描述符
    int clientsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(clientsock < 0)
    {
        printf("socket creation failed\n");
        exit(-1);
    }
    printf("socket create successfully.\n");

    struct sockaddr_in clientAddr;
    clientAddr.sin_family = AF_INET;
    clientAddr.sin_port = htons((u_short)SRVPORT);
    clientAddr.sin_addr.s_addr = inet_addr(CLTIP);

    if(connect(clientsock, (struct sockaddr*)&clientAddr, sizeof(struct sockaddr)) < 0)
    {
        printf("Connect error.IP[%s], port[%d]\n", CLTIP, clientAddr.sin_port);
        exit(-1);
    }
    printf("Connect to IP[%s], port[%d]\n", CLTIP, clientAddr.sin_port);

    char sendBuf[MAX_NUM]={0};
    char recvBuf[MAX_NUM]={0};
    while(gets(sendBuf) != '\0')
    {
        if(send(clientsock, sendBuf, strlen(sendBuf) + sizeof(char), 0) == -1)
        {
            printf("send error!\n");
        }
        printf("send to server:%s\n", sendBuf);
        memset(sendBuf, 0, sizeof(sendBuf));

        if(recv(clientsock, recvBuf, MAX_NUM, 0) == -1)
        {
            printf("rev error!\n");
        }
        printf("receive from server:%s\n",recvBuf);
        if(strcmp(recvBuf,"Goodbye,my dear client!")==0)
        {
            break;
        }
        memset(recvBuf, 0, sizeof(recvBuf));
    }
    close(clientsock);
    return 0;
}

 

附上makefile

server_tcp:server_tcp.o
        gcc -o server_tcp server_tcp.o
server_tcp.o:server_tcp.c
        gcc -c server_tcp.c
clean:
        rm -rf  server_tcp server_tcp.o
client_tcp:client_tcp.o
        gcc client_tcp.o -o client_tcp
client_tcp.o:client_tcp.c
        gcc -c client_tcp.c
clean:
        rm -rf client_tcp client_tcp.o

 

服務端運行情況:

客戶端運行情況:

 

2014-09-01 10:42:47


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM