में यूडीपी क्लाइंट-सर्वर मैं यूडीपी का उपयोग कर क्लाइंट सर्वर प्रोग्राम लिखने की कोशिश कर रहा हूं, और प्रतीक्षा-और-स्टॉप, लेकिन मुझे उस भाग में नहीं मिला है, मैं अभी भी इसे समझने की कोशिश कर रहा हूं दो क्लाइंट प्रोग्राम (सर्वर और क्लाइंट) संवाद कैसे करते हैं, क्योंकि मेरे क्लाइंट प्रोग्राम पर, उपयोगकर्ता को सर्वर का नाम या आईपी पता, और एक पोर्ट नाम दर्ज करना होगा, और तब एक अभिव्यक्ति भेजें जो सर्वर की गणना करनी चाहिए। हालांकि, मैंने इंटरनेट में कुछ ट्यूटोरियल खोले और तदनुसार कोडिंग के बाद (या मैंने ऐसा सोचा) मैं क्लाइंट को सर्वर के साथ संवाद नहीं कर सकता। नीचे मेरा कोड है, कृपया मुझे बताएं कि मैं क्या कर रहा हूं, अगर यह bind()
, sendto()
, recvfrom()
या socket()
, या उन सभी में से है। मैं नहीं देख सकता कि वास्तव में क्या गलत है। मुझे पता है कि क्लाइंट-साइड को अनंत लूप पर नहीं चलना चाहिए, लेकिन अब तक मैं प्रोग्राम एक-दूसरे के साथ संवाद करना चाहता हूं, इसके बाद मैं अपना कोड पॉलिश करूंगा। धन्यवाद!सॉकेट प्रोग्रामिंग: सी
क्लाइंट-साइड कोड:
#include <stdio.h> // Default System Calls
#include <stdlib.h> // Needed for OS X
#include <string.h> // Needed for Strlen
#include <sys/socket.h> // Needed for socket creating and binding
#include <netinet/in.h> // Needed to use struct sockaddr_in
#include <time.h> // To control the timeout mechanism
#define EXPR_SIZE 1024
#define BUFLEN 512
#define TRUE 1
#define FALSE 0
#define SERVERLEN 1024
int main(int argc, char **argv){
long portNum; // Since it's possible to input a value bigger
// than 65535 we'll be using long to
// avoid overflows
char expr[EXPR_SIZE];
char server[SERVERLEN];
int fd; // file descriptor for the connected socket
int buf[512];
struct hostent *h; // information of the host
unsigned int addrLen; // address length after getting the port number
struct sockaddr_in myaddr; // address of the client
struct sockaddr_in servaddr; // server's address
unsigned int exprLen;
socklen_t slen = sizeof(servaddr);
printf("Enter server name or IP address:");
scanf("%s",server);
printf("Enter port:");
scanf("%ld",&portNum);
if ((portNum < 0) || (portNum > 65535)) {
printf("Invalid port number. Terminating.");
return 0;
}
printf("Enter expression:");
scanf("%s",expr);
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
perror("cannot create socket");
return 0;
}
memset((char *)&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(0);
if(bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0){
perror("cannot bind");
return 0;
}
/*
// Discovering the port number the OS allocated
addrLen = sizeof(myaddr);
if(getsockname(fd, (struct sockaddr *)&myaddr, &addrLen) < 0){
perror("cannot getsockname");
return 0;
}
printf("local port number = %d\n", ntohs(myaddr.sin_port));
*/
memset((char*)&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htonl(portNum);
exprLen = sizeof(expr);
while(TRUE){
printf("Sending message to %s port %ld\n",server, portNum);
if (sendto(fd, expr, strlen(expr), 0, (struct sockaddr *)&servaddr, slen) < 0) {
perror("cannot sendto()");
}
printf("Success\n");
}
return 0;
}
सर्वर साइड कोड:
#include <stdio.h> // Default System Calls
#include <stdlib.h> // Needed for OS X
#include <string.h> // Needed for Strlen
#include <sys/socket.h> // Needed for socket creating and binding
#include <netinet/in.h> // Needed to use struct sockaddr_in
#include <time.h> // To control the timeout mechanism
#define EXPR_SIZE 1024
#define BUFLEN 512
#define TRUE 1
#define SERVERLEN 1024
int main(int argc, char **argv){
struct sockaddr_in myaddr; // address of the server
struct sockaddr_in claddr; // address of the client
char buf[BUFLEN];
int fd;
long recvlen;
socklen_t clientlen;
if((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){
perror("cannot create socket");
return 0;
}
memset((char *)&myaddr, 0, sizeof(myaddr));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = htonl(INADDR_ANY);
myaddr.sin_port = htons(0);
if(bind(fd, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0){
perror("cannot bind");
return 0;
}
clientlen = sizeof(claddr);
while (TRUE) {
recvlen = recvfrom(fd, buf, BUFLEN, 0, (struct sockaddr *)&claddr, &clientlen);
if (recvlen < 0) {
perror("cannot recvfrom()");
return 0;
}
printf("Received %ld bytes\n",recvlen);
buf[recvlen] = 0;
printf("Received message: \"%s\"\n",buf);
}
return 0;
}
सर्वर कार्यक्रम नहीं है उत्पादन कुछ भी है, जबकि ग्राहक आउटपुट जब तक प्रक्रिया में बाधा आती है:
Enter server name or IP address:127.0.0.1
Enter port:30
Enter expression:2+2
Sending message to 127.0.0.1 port 30
cannot sendto(): Can't assign requested address
मैंने सर्वर नाम को स्थानीयहोस्ट और अन्य बंदरगाहों में बदलने की कोशिश की, लेकिन इसका कोई फायदा नहीं हुआ।
है "मैं ग्राहक सर्वर के साथ संवाद नहीं कर सकता।"। क्या आप इससे थोड़ा विशिष्ट हो सकते हैं? क्या प्रोग्राम क्रैश होता है, क्या यह कोई आउटपुट नहीं बनाता है, क्या यह गलत आउटपुट उत्पन्न करता है? इत्यादि। किसी भी डिबगिंग निष्कर्ष भी शामिल करें जिन्हें आप पहले ही एकत्र कर चुके हैं। – kaylum
प्रश्न –
में आउटपुट को संपादित करने के लिए जा रहे हैं आपके क्लाइंट को उसी पोर्ट को भेजने की आवश्यकता है जिसे सर्वर ने बाध्य किया है। क्लाइंट में इस पंक्ति के लिए – kaylum