linux下簡易socket編程

最近研究了一下linux下的socket編程。這裏寫一個簡易的版本上去。主要是分client和server兩個部分。

對於client比較簡單,這裏僅做一個簡單的client。可以給自己的server發送一條消息並且可以得到一條服務器返回的消息,之後結束進程。

#include 
#include 
#include 
#include 
#include 
#include 

#define MAXNUM 255
#define BINDPORT 8000
int main(int argc, char** argv)
{
    int iSocketFd;
    int iRecvLen;          //用來獲取返回的字符串長度
    char cRecvMsg[MAXNUM]; //用來獲取由服務器傳來的信息
    char cSendMsg[MAXNUM];
    struct sockaddr_in Saddr;
    
    if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("socket init error");
        exit(0);
    }
    
    memset(&Saddr, 0, sizeof(Saddr));
    Saddr.sin_family = AF_INET;    //代表用的ipv4協議
    Saddr.sin_port = htons(BINDPORT);
    
    //用來獲取主機server的IP地址
    if(inet_pton(AF_INET, argv[1], &Saddr.sin_addr) <= 0)
    {
        printf("inet_pton error");
        exit(0);
    }
    
    if(connect(iSocketFd, (struct sockaddr*) &Saddr, sizeof(Saddr)) < 0)
    {
        printf("connect error");
        exit(0);
    }
    //讀取一行作爲傳送給server的信息
    fgets(cSendMsg, MAXNUM, stdin);
    if(send(iSocketFd, cSendMsg, strlen(cSendMsg), 0) < 0)
    {
        printf("send error");
        exit(0);
    }
    
    if((iRecvLen = recv(iSocketFd, cRecvMsg, MAXNUM, 0)) < 0)
    {
        printf("receive error");
        exit(0);
    }
    cRecvMsg[iRecvLen] = '\0';     //將收到的信息末端添加\0以便輸出。
    printf("received:%s", cRecvMsg);
    close(iSocketFd);
    return 0;
}

對於server。中間採用了調用子進程來進行收發消息的機制,這樣如果擴展可以用來併發的接待多位client.

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define BINDPORT 8000

int handleMsg(int iConnectFd);
int main(int argc, char ** argv)
{
    int iSocketFd, iConnectFd;
    struct sockaddr_in Saddr;
    char cServerAns[40] = "Server received Msg";
    char cMsg[255];
    pid_t pid;
    if((iSocketFd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        printf("create socket error");
        exit(0);
    }
    
    memset(&Saddr, 0, sizeof(Saddr));
    Saddr.sin_family = AF_INET;
    Saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    Saddr.sin_port = htons(BINDPORT);
    
    if(bind(iSocketFd, (struct sockaddr*)&Saddr, sizeof(Saddr)) < 0)
    {
        printf("bind error");
    }
    if(listen(iSocketFd, 10) < 0)
    {
        printf("listen socket error");
        exit(0);
    }
    while(true)
    {
        if((iConnectFd = accept(iSocketFd, (struct sockaddr*)NULL, NULL)) < 0)
        {
            printf("accept socket error");
        }
        pid = fork();
        if(pid < 0)
        {
            printf("fork error");
            exit(0);
        }
        else if(pid == 0)           //調用子進程進行收發信息
        {
            handleMsg(iConnect_fd);
            close(iConnectFd);
        }
        else if(pid > 0)
        {
            close(iConnectFd);
        }
    }
    close(iSocketFd);
}
int handleMsg(int iConnectFd)
{
    char cTime[255];
    char cRecvMsg[255];
    int iRecvLen;
    int iMsgLen;
    time_t now;
    iRecvLen = recv(iConnectFd, cRecvMsg, 255,0);
    cRecvMsg[iRecvLen] = '\0';
    now = time(0);
    strftime(cTime, 255, "%Y.%m.%d_%H:%M:%S", localtime(&now));
    printf("%s %d %s", cTime, getpid(), cRecvMsg);              //打印當前時間 子進程號 收到的信息
    
    if(send(iConnectFd, "you are connected!\n", 19, 0) < 0)
    {
        printf("send error");
        exit(0);
    }
}
基本就是這樣。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章