今回は課題でsocketを使い、クライアントから整数を渡し、サーバーでそれらを加算し、クライアントに返す、という処理を行いたいのですが、全くうまく行きません。
まずソースコードを貼ります。
(サーバー)
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<ctype.h>
#define SOCKET_NAME "my_socket"
#define N 256
int main()
{
int fd1,fd2,size;
char string[N];
char numstock[N];
int i,j,num,sum;
struct sockaddr_un server,client;//serverとclientの宣言
int clientlen=sizeof(struct sockaddr_un);
if((fd1=socket(PF_UNIX,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server,0,sizeof(struct sockaddr_un));
server.sun_family=AF_UNIX;
memcpy(server.sun_path,SOCKET_NAME,sizeof(SOCKET_NAME));
unlink(SOCKET_NAME);
if(bind(fd1,(struct sockaddr *)&server,sizeof(server))==-1)
{
perror("bind");
exit(EXIT_FAILURE);
}
if(listen(fd1,1)==1)
{
perror("listen");
exit(EXIT_FAILURE);
}
memset(&client,0,sizeof(struct sockaddr_un));
if((fd2=accept(fd1,(struct sockaddr *)&client,&clientlen))==-1)
{
perror("accept");
exit(EXIT_FAILURE);
}
do
{
if((size=read(fd2,string,sizeof(string)))==-1)
{
perror("read");
exit(EXIT_FAILURE);
}
i=0;
j=0;
sum=0;
printf("%s\n",string);
printf("%d\n",sum);
while(string[i]!='\0')
{
if(isdigit(string[i]))
{
numstock[j]=string[i];
j++;
if((string[i+1]==' ')||(string[i+1]=='\0'))
{
num=atoi(numstock);
printf("@ %d\n",num);
sum+=num;
printf("sum %d\n",sum);
int a;
for(a=0;a<=N;a++)
{
numstock[a]='\0';
}
j=0;
num=0;
}
}
i++;
}
}
while(size<=256);
close(fd2);
close(fd1);
exit(EXIT_SUCCESS);
}
#include<sys/types.h>
#include<sys/socket.h>
#include<sys/un.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<ctype.h>
#define SOCKET_NAME "my_socket"
int main()
{
int fd1;
int cint,size;
int sum,num;
char c;
struct sockaddr_un server;
if((fd1=socket(PF_UNIX,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memset(&server,0,sizeof(struct sockaddr_un));
server.sun_family=AF_UNIX;
memcpy(server.sun_path,SOCKET_NAME,sizeof(SOCKET_NAME));
if(connect(fd1,(struct sockaddr *)&server,sizeof(struct sockaddr_un))==-1)
{
perror("connect");
exit(EXIT_FAILURE);
}
while((cint=getchar())!=EOF)
{
c=cint;
if((size=write(fd1,&c,sizeof(char)))==-1)
{
perror("write");
exit(EXIT_FAILURE);
}
}
close(fd1);
exit(EXIT_SUCCESS);
}
2つをそれぞれ別の端末で起動した後にクライアント側で入力
125 10 19 2
と入力すると、サーバー側でこれらを全て加算し、クライアント側で
156
と表示させたいわけです。
この動作をクライアント側でctrl+dが入力されるまでループさせるのが目標ですが、現在加算自体がうまくいきません。
一応動作としては、サーバー側でstring配列にある文字列が数字であるとき、バッファnumstockに格納し、string[i+1]がスペース、または'\0'であった場合、atoiでnumstockの文字列を数字に変換し、それをsumに足す、というのになっています。
また、どのようにしてサーバーで加算した数をクライアントに表示させるかが思いつきません。
どうか解決策をおねがいします。