[英]Not able to connect with tcp ip - server client program in linux using C programming
[英]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.