#include <io.h>
#include <stdio.h>
#include <winsock2.h>
#include <string.h>
#define MY_PORT 8989
#define MAXBUF 256
int main(int argc, char *argv[]){
WSADATA wsa;
SOCKET sockfd ,clientfd; //define 2 sockets
struct sockaddr_in self;
char buffer[MAXBUF];
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0){
printf("Failed. Error Code : %d",WSAGetLastError());
return 1;
}
printf("Initialised.\n");
/*---create streaming socket---*/
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
perror("Socket");
exit(errno);
}
printf("Socket created.\n");
/*---initialize address/port structure---*/
/* bzero(&self, sizeof(self));*/
self.sin_family = AF_INET;
self.sin_port = htons(MY_PORT);
self.sin_addr.s_addr = INADDR_ANY;
/*---assign a port number to the socket---*/
if ((bind(sockfd, (struct sockaddr*)&self, sizeof(self)))!=0){
perror("socket--bind");
exit(errno);
}
puts("Bind done");
/*---make it a "listening socket"---*/
if ((listen(sockfd, 20))!=0){
perror("socket--listen");
exit(errno);
}
puts("Waiting for incoming connections...");
/*---forever... ---*/
while (1){
struct sockaddr_in client_addr;
int addrlen=sizeof(client_addr);
/*---accept a connection (creating a data pipe)---*/
clientfd = accept(sockfd, (struct sockaddr*)&client_addr, &addrlen);
//create variables
int length=recv(clientfd, buffer, MAXBUF, 0);
//output in reverse order & lowercase
for(int i=0; buffer[i]!='\0'; i++){
if(buffer[i]>=65 && buffer[i]<=90){ // check ascii value
buffer[i]= buffer[i]+32; // if uppercase thn change
}
}
int loop=0, len=strlen(buffer);
char temp; //temporary holds character to swap
len--; // remove null and start from 0
while (loop<len){
temp=buffer[loop];
buffer[loop]=buffer[len];
buffer[len]=temp;
loop++;
len--;
}
//send back
send(clientfd, buffer, sizeof(buffer), 0);
/*---close connection---*/
close(clientfd);
}
/*---clean up (should never get here!)---*/
close(sockfd);
WSACleanup();
return 0;
}
从客户端反转字符串工作得很好,但它也给出了许多其他不需要的字符后面,它和两个'PuTTy的,我是非常新的套接字编程,所以任何帮助是非常感谢。我不能使用任何字符串函数以外的strlen。目前使用puTTy打开8989服务器。远程登录连接是被动的。
2条答案
按热度按时间edqdpe6u1#
您的代码假定
buffer
以NUL终止,但是不能保证recv
(可能是recv
的一部分,这是流套接字)会接收到NUL字符。使用
recv
的返回值(如果是正值)来反转数据会更有意义,这样就不必担心消息边界。ztmd8pv52#
您总是发送MAXBUF(即256)字节,因为在
sizeof(buffer)
是声明的字符数组的大小例如,可以使用
strlen(buffer)
来修复此问题,或者保留您之前获得的len
。