20140617 - 소켓 정보보내기(서버, 클라이언트)
소켓 정보보내기(서버, 클라이언트)
여기서 말하는 데이터를 문자열이다.
소켓 번호로 read를 했을 때
저수준 입력을 사용 했을 때
server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <linux/types.h>
#include <netinet/in.h>
#include <errno.h>
int main()
{
struct sockaddr_in stAddr; //server addr
struct sockaddr_in stClient1;
int iSoc; //socket descripter
int iCle1;
int iRet;
unsigned int uiSize;
unsigned char ucBuff[250];
iSoc = socket(AF_INET, SOCK_STREAM, 0);
if(-1==iSoc)
{
perror("socket() ");
return 0;
}
stAddr.sin_family = AF_INET;
//소켓의 첫 번째 인자를 넣는다.
stAddr.sin_port = htons(PORT);
stAddr.sin_addr.s_addr = inet_addr("192.168.10.250");
iRet=bind(iSoc, (struct sockaddr *)(&stAddr),sizeof(stAddr));
if(-1==iRet)
{
perror("bind() ");
close(iSoc);
return 0;
}
iRet=listen(iSoc,5);
if(-1==iRet)
{
perror("listen() ");
close(iSoc);
return 0;
}
uiSize=sizeof(stClient1);
iCle1=accept(iSoc,(struct sockaddr *)(&stClient1),&uiSize);
//클라이언트의 인적사항 조사 accept가 리턴되면 새로운 소켓을 생성한다.
if(iCle1==-1)
{
perror("accept() ");
close(iSoc);
return 0;
}
printf("iSoc : %d\niRet : %d \n",iSoc, iRet);
printf("iCle1 : %d\n",iCle1);
write(iCle1,"welcome",7);
iRet=read(iCle1,ucBuff,sizeof(ucBuff));
ucBuff[iRet]=0;
printf("%s\n",ucBuff);
iRet=read(iCle1,ucBuff,sizeof(ucBuff));
ucBuff[iRet]=0;
printf("%s\n",ucBuff);
close(iSoc);
close(iCle1);
return 0;
}
client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <linux/types.h>
#include <netinet/in.h>
#include <errno.h>
int main()
{
struct sockaddr_in stAddr;
int iSoc;
int iRet;
unsigned char ucBuff[250];
iSoc = socket(AF_INET, SOCK_STREAM, 0);
if(-1==iSoc)
{
perror("socket() ");
return 0;
}
stAddr.sin_family = AF_INET;
//소켓의 첫 번째 인자를 넣는다.
stAddr.sin_port = htons(PORT);
stAddr.sin_addr.s_addr = inet_addr("192.168.10.250");
iRet=connect(iSoc, (struct sockaddr *)(&stAddr),sizeof(stAddr));
if(-1==iRet)
{
perror("connect() "); //나머지 에러 내용을 peeror이 출력해줌.
close(iSoc);
return 0;
}
printf("iSoc : %d\n iRet : %d \n",iSoc, iRet);
iRet=read(iSoc,ucBuff,sizeof(ucBuff));
//read함수는 받은 byte만큼 리턴해줌.
ucBuff[iRet]=0;
printf("%s\n",ucBuff);//받기
write(iSoc,"shutup",6);
iRet=read(1,ucBuff,sizeof(ucBuff));
//1은 키보드 입력.
write(iSoc,ucBuff,iRet-1);
#include <stdio.h>
#include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 4090 #define BUFSIZE 1024 int main(int argc, char *argv[]) { int sockfd; struct sockaddr_in servAddr; char sendBuffer[BUFSIZE]; char recvBuffer[BUFSIZE]; int recvLen; if(argc!=2) { fprintf(stderr, "Usage:%s IP_address\n", argv[0]); exit(1); } if((sockfd=socket(AF_INET, SOCK_STREAM, 0))== -1) { perror("sock failed"); exit(1); } memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = inet_addr(argv[1]); servAddr.sin_port = htons(PORT); if(connect(sockfd, (struct sockaddr*)&servAddr, sizeof(servAddr))== -1) { perror("connect failed"); exit(1); } while(1) { printf("Input sending message ==> "); fgets(sendBuffer, BUFSIZE, stdin); if(!strncmp(sendBuffer, "quit", 4)) break; if(send(sockfd, sendBuffer, strlen(sendBuffer), 0)!=strlen(sendBuffer)) { perror("send failed"); exit(1); } if((recvLen=recv(sockfd, recvBuffer, BUFSIZE-1, 0))<=0) { perror("recv failed"); exit(1); } recvBuffer[recvLen]='\0'; printf("Received : %s\n",recvBuffer); } close(sockfd); exit(0); return 0; }
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define PORT 4090 #define MAXPENDING 5 #define BUFSIZE 1024 int main() { int servSockfd; int clntSockfd; struct sockaddr_in servAddr; struct sockaddr_in clntAddr; char recvBuffer[BUFSIZE]; int clntLen; int recvLen; if((servSockfd=socket(AF_INET, SOCK_STREAM, 0))== -1) { perror("sock failed"); exit(1); } memset(&servAddr, 0, sizeof(servAddr)); servAddr.sin_family = AF_INET; servAddr.sin_addr.s_addr = htonl(INADDR_ANY); servAddr.sin_port = htons(PORT); if(bind(servSockfd, (struct sockaddr*)&servAddr, sizeof(servAddr))==-1) { perror("bind failed"); exit(1); } if(listen(servSockfd, MAXPENDING)==-1) { perror("listen failed"); exit(1); } while(1) { clntLen = sizeof(clntAddr); if((clntSockfd=accept(servSockfd,(struct sockaddr*)&clntAddr, &clntLen))==-1) { perror("accept failed"); exit(1); } while(1) { if((recvLen=recv(clntSockfd, recvBuffer, BUFSIZE-1,0))== -1) { perror("recv failed"); exit(1); } if(recvLen==0) break; recvBuffer[recvLen]='\0'; printf("Received : %s\n",recvBuffer); if(send(clntSockfd, recvBuffer,recvLen,0)!=recvLen) { perror("send failed"); exit(1); } } close(clntSockfd); } return 0; }