簡體   English   中英

創建服務器/客戶端TCP / IP程序的麻煩

[英]Troubles creating a Server/Client TCP/IP Program

我必須創建一個TCP / IP服務器/客戶端套接字程序,其中服務器和客戶端必須位於同一.c文件中。 下面是我的代碼,如果沒有輸入命令行參數,則會創建一個服務器,並等待另一個進程啟動連接。 如果輸入了一個命令行參數(IP地址),則該進程將充當客戶端角色,並連接到在特定IP地址執行的另一進程。 我只是在使用本地主機。

當我使用IP地址(./game localhost)運行程序時,我得到了

~/Desktop/a5 20 $ ./game localhost
ERROR connecting: Connection refused

當我在沒有IP地址(./game)的情況下運行該程序時,我會遇到段錯誤

~/Desktop/a5 19 $ ./game
Segmentation fault (core dumped)

對於我做錯的任何幫助將不勝感激!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <unistd.h>

#define h_addr h_addr_list[0]

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

int main(int argc, char *argv[]) {

  int sockfd, newsockfd, portno, clilen, sockfd2, portno2, n, n2;
  char buffer[256];
  char buffer2[256];
  struct sockaddr_in serv_addr, cli_addr, serv_addr2;
  struct hostent *server;

  portno = 4547;

  if (argc == 1) {
    sockfd2 = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd2 < 0) {
      error("ERROR opening socket");
    }

    server = gethostbyname(argv[1]);

    if (server == NULL) {
      fprintf(stderr,"ERROR, no such host\n");
      exit(0);
    }

    bzero((char *) &serv_addr2, sizeof(serv_addr2));
    serv_addr2.sin_family = AF_INET;

    bcopy((char *)server->h_addr,(char *)&serv_addr2.sin_addr.s_addr,server->h_length);

    serv_addr2.sin_port = htons(portno);

    if (connect(sockfd2,(struct sockaddr *)&serv_addr2,sizeof(serv_addr2)) < 0) {
      error("ERROR connecting");
    }

    printf("Please enter the message: ");
    bzero(buffer2,256);
    fgets(buffer2,255,stdin);
    n2 = write(sockfd2,buffer2,strlen(buffer2));

    if (n2 < 0) {
      error("ERROR writing to socket");
    }

    printf("%s\n",buffer2);
  }

  else if (argc == 0) {

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    if (sockfd < 0) {
      error("ERROR opening socket");
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));

    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");
    }
  }

  return 0;
}

通常argv[0]是指向可執行文件執行命令的指針。 這意味着argc 始終至少為1
像這樣增加對argc的檢查

if (argc == 1)

因此,以上if子句變為

if (argc == 2)

這是因為你的分段錯誤的原因argv[1]傳遞給gethostbyname如果不指向參數argc == 1 ,但包含NULL作為該標准規定argv[argc] == NULL


請注意,這適用於常見系統。 不是在C標准中定義的,而是在POSIX標准AFAIK中定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM