socket

一開始先參考此篇,雖然講解不錯,但範例server會有segment fault

https://puremonkey2010.blogspot.tw/2012/07/networkprg-tcp-clientserver.html

再來可看此篇http://www.linuxhowtos.org/C_C++/socket.htm 範例可以跑

0.

int sock0;  
  struct sockaddr_in addr;  
  struct sockaddr_in client;  
  socklen_t len;  
  int sock_client;

1.

/* 製作 socket */  
sock0 = socket(AF_INET, SOCK_STREAM, 0);

http://baike.baidu.com/item/SOCK\_STREAM

2.

/* 設定 socket */  
  addr.sin_family = AF_INET;  
  addr.sin_port = htons(12345);  
  addr.sin_addr.s_addr = INADDR_ANY;  
  bind(sock0, (struct sockaddr*)&addr, sizeof(addr));  
  printf("\t[Info] binding...\n");

利用步驟0第二行宣告的 addr ,設定struct內的屬性

http://www.360doc.com/content/12/0222/10/54470_188560773.shtml

3.

listen(sock0, 5);  
printf("\t[Info] listening...\n");

http://stenlyho.blogspot.tw/2008/08/socket-listen.html

以上範例均無處理錯誤

完整包含錯誤處理參考如下

http://www.linuxhowtos.org/data/6/server.c

使用c 的server.c

/* A simple server in the internet domain using TCP
   The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
    perror(msg);
    exit(1);
}

int main(int argc, char *argv[])
{
     int sockfd, newsockfd, portno;
     socklen_t clilen;
     char buffer[256];
     struct sockaddr_in serv_addr, cli_addr;
     int n;
     if (argc < 2) {
         fprintf(stderr,"ERROR, no port provided\n");
         exit(1);
     }
     sockfd = socket(AF_INET, SOCK_STREAM, 0);
     if (sockfd < 0) 
        error("ERROR opening socket");
     bzero((char *) &serv_addr, sizeof(serv_addr));
     portno = atoi(argv[1]);
     serv_addr.sin_family = AF_INET;
     serv_addr.sin_addr.s_addr = INADDR_ANY;
     serv_addr.sin_port = htons(portno);
     if (bind(sockfd, (struct sockaddr *) &serv_addr,
              sizeof(serv_addr)) < 0) 
              error("ERROR on binding");
     listen(sockfd,5);
     clilen = sizeof(cli_addr);
     newsockfd = accept(sockfd, 
                 (struct sockaddr *) &cli_addr, 
                 &clilen);
     if (newsockfd < 0) 
          error("ERROR on accept");
     bzero(buffer,256);
     n = read(newsockfd,buffer,255);
     if (n < 0) error("ERROR reading from socket");
     printf("Here is the message: %s\n",buffer);
     n = write(newsockfd,"I got your message",18);
     if (n < 0) error("ERROR writing to socket");
     close(newsockfd);
     close(sockfd);
     return 0; 
}

#Windows C++ web server簡單範例

#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DEFAULT_PORT 8080

void error_die(const char *s)
{
    fprintf(stderr, "Error: %s failed with error %d\n", s, WSAGetLastError());
    WSACleanup();
    exit(EXIT_FAILURE);
}

int main(int argc, char **argv)
{
    char response[] = "HTTP/1.1 200 OK\r\n"
    "Content-Type: text/html; charset=UTF-8\r\n\r\n"
    "<!DOCTYPE html><html><head><title>Hello World</title></head>"
    "<body><h1>Hello world!</h1></body></html>\r\n";

    char buf[4096];
    int msg_len, addr_len;
    struct sockaddr_in local, client_addr;

    SOCKET sock, msg_sock;
    WSADATA wsaData;

    if (WSAStartup(MAKEWORD(2, 2), &wsaData) == SOCKET_ERROR)
    {
        fprintf(stderr, "WSAStartup failed with error %d\n", WSAGetLastError());
        WSACleanup();
        return -1;
    }

    // Fill in the address structure
    local.sin_family        = AF_INET;
    local.sin_addr.s_addr   = INADDR_ANY;
    local.sin_port          = htons(DEFAULT_PORT);

    sock = socket(AF_INET, SOCK_STREAM, 0);  //TCP socket

    if (sock == INVALID_SOCKET)
        error_die("socket()");

    if (bind(sock, (struct sockaddr *)&local, sizeof(local)) == SOCKET_ERROR)
        error_die("bind()");

    if (listen(sock, 5) == SOCKET_ERROR)   // wait for connection
        error_die("listen()");

    printf("Waiting for connection...\n");

    while (1)
    {
        addr_len = sizeof(client_addr);
        msg_sock = accept(sock, (struct sockaddr*)&client_addr, &addr_len);

        if (msg_sock == INVALID_SOCKET || msg_sock == -1)
            error_die("accept()");

        printf("Accepted connection from %s, port %d\n", inet_ntoa(client_addr.sin_addr), htons(client_addr.sin_port));

        msg_len = recv(msg_sock, buf, sizeof(buf), 0);

        printf("Bytes Received: %d, message: %s from %s\n", msg_len, buf, inet_ntoa(client_addr.sin_addr));

        msg_len = send(msg_sock, response, sizeof(response)-1 , 0);

        if (msg_len == SOCKET_ERROR)
            error_die("send()");

        if (!msg_len)
        {
            printf("Client closed connection\n");
            closesocket(msg_sock);
            WSACleanup();
            return -1;
        }

        closesocket(msg_sock);
    }

    WSACleanup();
}

編譯

g++ test.cpp -o test -lws2_32

然後執行

test

#Linux socket

http://advancedlinuxprogramming.com/listings/chapter-11/server.c

Last updated