멀티 스레드 에코서버/클라이언트

#include<stdio.h>
#include <stdlib.h>
#include <string.h>#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define ECHOMAX 255

int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in echoServAddr;
struct sockaddr_in fromAddr;
unsigned short echoServPort;
unsigned int fromSize;
char *servIP;
char *echoString;
char echoBuffer[ECHOMAX+1];
int echoStringLen;

if((echoStringLen=strlen(echoString))>ECHOMAX)
{
printf(“Echo word too long”);
exit(0);
}

if(argc=4)
echoServPort=atoi(argv[3]);
else
echoServPort=7;

if((sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))<0)
{
printf(“socket() failed”);
exit(0);
}

memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family=AF_INET;
echoServAddr.sin_addr.s_addr=inet_addr(servIP);
echoServAddr.sin_port=htons(echoServPort);

if(sendto(sock, echoString, echoStringLen, 0, (struct sockaddr *)&echoServAddr,
sizeof(echoServAddr))!=echoStringLen){
printf(“sendto() sent a different number of bytes than expected”);
exit(0);
}

fromSize=sizeof(fromAddr);

if((respStringLen=recvfrom(sock, echoBuffer, ECHOMAX, 0, (struct sockaddr *)&fromAddr,
&fromSize))!=echoStringLen){
printf(“recvfrom() failed”);
exit(0);
}

if(echoServAddr.sin_addr.s_addr !=fromAddr.sin_addr.s_addr)
{
fprintf(stderr,”Error: received a packet from unknown source.\n”);
exit(1);
}

echoBuffer[respStringLen]=’\0′;
printf(“Received: %s\n”, echoBuffer);
close(sock);
exit(0);
}

#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define MAX_BUFFER 1024

typedef struct _message{
long message_type;
struct sockaddr_in addr;
char message_text[MAX_BUFFER];
}message_t;

struct sockaddr_in servaddr;
int sock;
int msqid;

void *echo_recv(void *arg)
{
int nbytes, status, len = sizeof(struct sockaddr);
message_t pmessage;
int size;
size = sizeof(pmessage) – sizeof(long);
pmessage.message_type = pthread_self();
while(1) {
nbytes = recvfrom(sock, pmessage.message_text, MAX_BUFFER, 0,
(struct sockaddr *)&pmessage.addr, &len);
if(nbytes < 0)
thr_errquit(“recvfrom fail”, errno);
pmessage.message_text[nbytes] = 0;
printf(“recv thread = %ld\n”, pthread_self());
if(msgsnd(msqid, &pmessage, size, 0) == -1)
thr_errquit(“메시지보냄 실패”, errno);
}
}

void *echo_resp(void *arg)
{
message_t pmessage;
int nbytes, len = sizeof(struct sockaddr);
int size;
size = sizeof(pmessage) – sizeof(long);
pmessage.message_type = 0;
while(1)
{

nbytes = sendto(sock, pmessage.message_text, strlen(pmessage.message_text), 0,
(struct sockaddr*)&pmessage.addr, len);
if(nbytes < 0)
thr_errquit(“전송 실패”,errno);

printf(“응답 스레드 = %ld\n\n”, pthread_self());
pmessage.message_text[0] = 0;
}
}

oid errquit(char *message)
{
perror(message);
exit(-1);
}

void thr_errquit(char *message, int errcode)
{
printf(“%s : %s\n”,message, strerror(errcode));
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t tid[6];
struct sockaddr_in cliaddr;
int port, status, i, len = sizeof(struct sockaddr);
key_t msqkey;
if(msgrcv( msqid,(void *)&pmessage, size, 0, 0) < 0)
{
perror(“msgrcv fail”); exit(0);
}

if(argc!=3)
{
printf(“Usage: %s msgkey port\n”, argv[0]);
exit(1);
}
msqkey = atoi(argv[1]);
port = atoi(argv[2]);

if( (msqid = msgget(msqkey, IPC_CREAT | 0660)) < 0)
errquit(“메시지큐 실패”);

if( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
errquit(“소켓 실패”);

bzero(&servaddr, len);
servaddr.sin_port = htons(port);
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_family=AF_INET;
bind(sock, (struct sockaddr*)&servaddr, len);

for(i=0; i<5; i++)
if((status=pthread_create(&tid[i], NULL, echo_recv, NULL))!=0)
thr_errquit(“pthread_create”, status);

if((status=pthread_create(&tid[5], NULL, echo_resp, NULL))!=0)
thr_errquit(“pthread_create”, status);
for(i=0; i<6; i++)
pthread_join(tid[i], NULL);

msgctl(msqid, IPC_RMID, 0);
return 0;
}

=====================================================================

#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define ECHOMAX 255

int main(int argc, char *argv[])
{
int sock;
struct sockaddr_in echoServAddr;
struct sockaddr_in fromAddr;
unsigned short echoServPort;
unsigned int fromSize;
char *servIP;
char *echoString;
char echoBuffer[ECHOMAX+1];
int echoStringLen;

if((echoStringLen=strlen(echoString))>ECHOMAX)
{
printf(“Echo word too long”);
exit(0);
}

if(argc=4)
echoServPort=atoi(argv[3]);
else
echoServPort=7;

if((sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))<0)
{
printf(“socket() failed”);
exit(0);
}

memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family=AF_INET;
echoServAddr.sin_addr.s_addr=inet_addr(servIP);
echoServAddr.sin_port=htons(echoServPort);

if(sendto(sock, echoString, echoStringLen, 0, (struct sockaddr *)&echoServAddr,
sizeof(echoServAddr))!=echoStringLen){
printf(“sendto() sent a different number of bytes than expected”);
exit(0);

}

fromSize=sizeof(fromAddr);

if((respStringLen=recvfrom(sock, echoBuffer, ECHOMAX, 0, (struct sockaddr *)&fromAddr,
&fromSize))!=echoStringLen){
printf(“recvfrom() failed”);
exit(0);
}

if(echoServAddr.sin_addr.s_addr !=fromAddr.sin_addr.s_addr)
{
fprintf(stderr,”Error: received a packet from unknown source.\n”);
exit(1);
}

echoBuffer[respStringLen]=’\0′;
printf(“Received: %s\n”, echoBuffer);
close(sock);
exit(0);
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다