سلام.
متاسفانه چند روزی هست که نمیرسم زیاد به اینجا سر بزنم و بخاطر همین نتونستم جواب پستهای که زدیدو بدم.
ولی چیزی که میخواستید رو براتون نوشتم البته به ساده ترین شکل . یک گفتگوی دونفره میان Client و Server که با ارسال کلمه Bye از طرف Client به پایان میرسه.
همانطور که خواستید Server طوری نوشته شده که فقط روی Localhost کار میکنه.
امیدوارم بدردتون بخوره.
فقط به علت کمبود وقت یکم با عجله نوشتم و خوب کامنت گذاری نکردم.
Server:
کد:/*listener.c -- a datagram sockets
in localhost
*/
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#define MYPORT 4950 //First Client(s)
#define MAXBUFLEN 256
int main(void)
{
WSAData myWsa;
SOCKET sockfd;//My Socket
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int addr_len;
int numbytes;
char buf[MAXBUFLEN];
char input_mes[256];
//Open connection and test it.
if ( WSAStartup(MAKEWORD(2,0), &myWsa) != 0 ){
WSACleanup();
return true;
}
//Opening DataGram Socket.
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd == INVALID_SOCKET)
{
fprintf(stderr, "Could not create socket.\n");
WSACleanup();
exit(0);
}
//Bind socket on port 4950
my_addr.sin_family = AF_INET;// host byte order
my_addr.sin_port = htons(MYPORT);// short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY;// automathically filled by my IP
memset(&(my_addr.sin_zero),'\0',8);// zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == INVALID_SOCKET){
perror("Port 4950 bind error");
exit(1);
}
printf("Server is configured for run in localhost.\n\nServer Socket on port 4950 binded.\nReady to recive from client(s)...\n");
addr_len = sizeof(struct sockaddr);
//Recive Data from Client(s)
while(true)
{
memset(buf, 0, sizeof buf);
memset(input_mes, 0, sizeof input_mes);
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1, 0, (struct sockaddr *) &their_addr,&addr_len)) == INVALID_SOCKET){
perror("Recive error.");
exit(1);
}
else
{
buf[numbytes] = '\0';
if ( strcmp(buf, "bye") == 0)
{
printf("Recive Bye message from Client.");
return 0;
}
else
{
printf("Recive From Client: \"%s\"\n\n",buf);
printf("Send to Client: ");
gets( input_mes);
if ((numbytes = sendto(sockfd, input_mes, strlen(input_mes), 0, (sockaddr*)(&their_addr),sizeof(sockaddr))) == -1)
{
perror("Sending error.");
exit(1);
}
}
}
}
closesocket(sockfd);
return 0;
}
Client:
کد:/* talker.c -- a datagram sockets "client" demo */
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "Ws2_32.lib")
#define MYPORT 4950 //the port users will be connecting to
#define MAXBUFLEN 256
int main(int argc, char *argv)
{
WSAData myWsa;
SOCKET sockfd;
struct sockaddr_in their_addr;
int numbytes;
int addr_len;
char buf[MAXBUFLEN];
char input_mes[MAXBUFLEN];
//Open connection and test it.
if ( WSAStartup(MAKEWORD(2,0), &myWsa) != 0 ){
WSACleanup();
return true;
}
if ((sockfd = socket(PF_INET,SOCK_DGRAM,0)) == -1)
{
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;// host byte order
their_addr.sin_port = htons(MYPORT);// short, network byte order
their_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
while(true)
{
memset(buf, 0, sizeof buf);
memset(input_mes, 0, sizeof input_mes);
printf("Send to Server: ");
gets( input_mes);
if ((numbytes = sendto(sockfd, input_mes, strlen(input_mes), 0, (sockaddr*)(&their_addr),sizeof(sockaddr))) == -1)
{
perror("Sending error.");
exit(1);
}
addr_len = sizeof(struct sockaddr);
printf("sent %d bytes to server%s\n",numbytes,inet_ntoa(their_addr.sin_addr));
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1, 0, (sockaddr*)(&their_addr),&addr_len)) == INVALID_SOCKET){
perror("Recive error.");
exit(1);
}
printf("\nRecive %d bytes from %s\n",numbytes,inet_ntoa(their_addr.sin_addr));
printf("Recive from server \"%s\"\n\n",buf);
}
closesocket(sockfd);
return 0;
}
