ソケットで最初のサーバークライアントアプリケーションを作成する際に問題が発生します。サーバーのソケットアドレスをlocalhostに、そしてポートを55555にハードコードしました。クライアントから別のターミナルで./player localhost 55555と入力すると、サーバーに何も起こりません。私は、サーバーが "Rock"というデータを受け取り、 "Client:ready。\ nGo \ nGo \ n Client:Rock"という文字列を出力すると思います。代わりに、サーバーはプレーヤーに反応しないで待機し続けます。私は実際にサーバーに接続していないと思ったので、プレーヤーアドレスに "localhost"というソケットアドレスをハードコードしようとしましたが、ポートは55555(ハードコーディングされています)にも接続されました。 ./playerコマンドを実行しようとしましたが、「接続:接続が拒否されました」というメッセージが表示されます。私は、ハードコーディングされplayer.cUnixサーバークライアント接続:接続が拒否されました
referee.c(これはサーバです)
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int main(int argc, const char* argv[])
{
char buf[1024];
struct sockaddr_in localhost;
int listenSock, serviceSock, bytesRead;
size_t len = sizeof(localhost);
int port = 55555;
listenSock = socket(AF_INET, SOCK_STREAM, 0);
if (listenSock<0) {
perror("Socket");
exit(1);
}
bzero((char*)&localhost, len);
localhost.sin_family = AF_INET;
localhost.sin_addr.s_addr = htonl(INADDR_ANY);
localhost.sin_port = htons(port);
bind(listenSock, (struct sockaddr*) &localhost, len);
printf("Paper, Scissors, Rock game start.\nWaiting for player...\n");
listen(listenSock, 5);
do {
serviceSock = accept(listenSock, 0, 0);
if(serviceSock == -1){
perror("Accept");
}
else do {
bzero(buf, sizeof(buf));
if((bytesRead = read(serviceSock, buf, 1024))<0) {
perror("Read");
}
if(bytesRead > 0){
printf("Client: ready.\nGo\n Client: %s\n", buf);
}
} while (bytesRead != 0);
close(serviceSock);
} while(1);
}
player.c(クライアント)
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int sock;
struct sockaddr_in server;
struct hostent *hp;
char buf[1024], *data = "Rock";
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Socket");
exit(1);
}
server.sin_family = AF_INET;
hp = gethostbyname(argv[1]);
if (hp == 0) {
fprintf(stderr, "%s: unknown host", argv[1]);
exit(1);
}
bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
server.sin_port = htons(atoi(argv[2]));
if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
perror("Connect");
exit(1);
}
if(write(sock, data, strlen(data)) < 0) {
perror("Write");
}
close(sock);
}
を修正する可能性がどのように思っていましたハードコードされたアドレス/ポートを持つplayer.c
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
int sock;
struct sockaddr_in server;
struct hostent *hp;
char buf[1024], *data = "Rock";
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("Socket");
exit(1);
}
server.sin_family = AF_INET;
hp = gethostbyname("localhost");
if (hp == 0) {
fprintf(stderr, "%s: unknown host", argv[1]);
exit(1);
}
bcopy(hp->h_addr, &server.sin_addr, hp->h_length);
server.sin_port = 55555;
if(connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
perror("Connect");
exit(1);
}
if(write(sock, data, strlen(data)) < 0) {
perror("Write");
}
close(sock);
}
エラーのために 'bind()'と 'listen()'の結果をチェックする必要があります。 – EJP