送信と受信を交互にやるために
ソケットを切断しなければいけないようですが、
タイミングがよくわからないので
ここのサイトを参考に
http://intuniv.cs.shinshu-u.ac.jp/Lectu ... ample.html
作っています。
サーバ、クライアントの順に
コンパイルし、実行したところ、
"recv_error :10038"と表示されます。
"ソケット以外のものに対して操作を実行しようとしました。"
という意味らしいです。
原因は何でしょう。
サーバプログラム
#pragma comment(lib, "wsock32.lib")
#include <stdio.h>
#include <winsock2.h>
#define PORT 80
#define BUFF_SIZE 1024
int crypt(char buff[BUFF_SIZE])
{
int key = 1853;
size_t i;
for(i=0;i<strlen(buff);i++)
{
buff[i] ^= key;
}
return 0;
}
int main(void)
{
WSADATA wsaData;
SOCKET setting_socket, next_socket;
struct sockaddr_in addr;
struct sockaddr_in client;
int len;
//char sendbuff[BUFF_SIZE];
char recvbuff[BUFF_SIZE];
WSAStartup(MAKEWORD(2,0), &wsaData);
setting_socket = socket(AF_INET, SOCK_STREAM, 0);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
bind(setting_socket, (struct sockaddr *)&addr, sizeof(addr));
listen(setting_socket, SOMAXCONN);
len = sizeof(client);
while(1)
{
if(next_socket = accept(setting_socket, (struct sockaddr *)&client, &len)<0)
{
printf("accept_error : %d\n", WSAGetLastError());
break;
}
memset(recvbuff, 0, BUFF_SIZE);
while(1)
{
len = recv(next_socket, recvbuff, BUFF_SIZE, 0);
if(len == SOCKET_ERROR)
{
printf("recv_error : %d\n", WSAGetLastError());
closesocket(setting_socket);
closesocket(next_socket);
WSACleanup();
return -1;
}
puts("recv_success");
recvbuff[len] = '\0';
crypt(recvbuff);
if(strcmp(recvbuff,"exit")==0)
{
break;
}
else
{
printf("%s\n",recvbuff);
}
crypt(recvbuff);
if(send(next_socket, recvbuff, BUFF_SIZE, 0)==SOCKET_ERROR)
{
printf("send_error : %d\n", WSAGetLastError());
closesocket(setting_socket);
closesocket(next_socket);
WSACleanup();
return -1;
}
}
}
closesocket(setting_socket);
closesocket(next_socket);
WSACleanup();
return 0;
}
#pragma comment(lib, "wsock32.lib")
#include <stdio.h>
#include <winsock2.h>
#define PORT 80
#define BUFF_SIZE 1024
int crypt(char buff[BUFF_SIZE])
{
int key = 1853;
size_t i;
for(i=0;i<strlen(buff);i++)
{
buff[i] ^= key;
}
return 0;
}
int main(void)
{
WSADATA wsaData;
struct sockaddr_in server;
SOCKET sock;
char command[BUFF_SIZE];
char output[BUFF_SIZE];
WSAStartup(MAKEWORD(2,0), &wsaData);
sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
while(1)
{
if(connect(sock, (struct sockaddr *)&server, sizeof(server))<0)
{
printf("connect_error : %d\n", WSAGetLastError());
break;
}
puts("connect_success"); scanf_s("%s",&command);
if(strcmp(command,"exit")==0)
{
return 0;;
}
crypt(command);
if(send(sock,command,sizeof(command),0)==SOCKET_ERROR)
{
printf("send_error : %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
puts("send_success");
int len = recv(sock,output,sizeof(output),0);
if(len == SOCKET_ERROR)
{
printf("recv_error : %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return -1;
}
puts("recv_success");
output[len] = '\0';
crypt(output);
printf("%s\n",output);
}
closesocket(sock);
WSACleanup();
return 0;
}