recv funktioniert nicht
-
Ich versuche einen kleinen IRC Client zu programmieren.
Z.Z. kann man mit dem Programm eine Verbindung zum EFnet aufbauen.
Der Nick wird automatisch übertragen.
Danach kommt die MOTD vom Server.
Den Rest sollte man dann selbst eingeben können, wie mit Telnet eben.
Jedoch empfängt recv nach der MOTD nichts mehr!
Es werden aber tatsächlich Daten empfangen.
Bitte helft mir da raus, ich habe schon seit Studenen keine Ideen mehr.#include <winsock2.h> #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; #define MBOX(x,y) MessageBox(NULL,x,y,MB_OK) SOCKET sock; long WINAPI GetData(long lParam) { WSABUF *wbuf = new WSABUF; wbuf->buf=new char[255]; wbuf->len=254; char test[255]; DWORD dwFlags =0, dwBytesRet = 0; fd_set st; st.fd_array[0]=sock; st.fd_count=1; timeval time; time.tv_sec = 2; time.tv_usec = 0; int s=0; while(true) { ZeroMemory(wbuf->buf,sizeof(wbuf->buf)); ZeroMemory(test,sizeof(test)); dwFlags = 0; //if(WSARecv(sock,wbuf,1,&dwBytesRet,&dwFlags,NULL,NULL)!=0) if(SOCKET_ERROR==recv(sock,test,254,NULL)) { if(WSAGetLastError()!=10035) { char buf[200]; sprintf(buf,"WSARecv failed. Code %d",WSAGetLastError(),sock); MessageBox(NULL,buf,"Alert!",MB_OK); WSACleanup(); return 0; } MBOX("Would block","YEA"); } MBOX("Recv","YEA"); //_snprintf(test,dwBytesRet,wbuf->buf); printf("%s",test); } return lParam; } int main() { WSADATA wsd; DWORD dwBytesRet=0, dwFlags=0; WSABUF *wbuf = new WSABUF; wbuf->buf=new char[255]; SOCKADDR_IN adr; in_addr ad; adr.sin_addr.s_addr = inet_addr("80.240.238.17"); adr.sin_family = AF_INET; adr.sin_port = htons(6667); char test[255]; sprintf(test,"sin_family: %d sin_addr: %d sin_port: %d sin_zero: %s",adr.sin_family,adr.sin_addr,adr.sin_port,adr.sin_zero); int err=0; err=WSAStartup(MAKEWORD(2,2),&wsd); if (err!=0) { MessageBox(NULL, "WSAStartup failed!","ERROR",MB_OK); return 0; } printf("Startup successful\n"); sock= WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, 0,WSA_FLAG_OVERLAPPED); //sock=WSASocket(AF_INET,SOCK_STREAM,IPPROTO_IP,NULL,0,WSA_FLAG_OVERLAPPED); if(sock==INVALID_SOCKET) { MessageBox(NULL,"Creation of Socket failed","ERROR",MB_OK); WSACleanup(); return 0; } printf("Socket created\n"); if(WSAConnect(sock,(sockaddr*)&adr,sizeof(sockaddr),NULL,NULL,NULL,NULL)==SOCKET_ERROR) { char buf[200]; sprintf(buf,"Bind call failed!. Code %d",WSAGetLastError(),sock); MessageBox(NULL,buf,"Alert!",MB_OK); WSACleanup(); return 0; } printf("Connected\n"); /*ULONG NonBlock = 1; if (ioctlsocket(sock, FIONBIO, &NonBlock) == SOCKET_ERROR) { printf("ioctlsocket() failed \n"); return 0; }*/ sprintf(wbuf->buf,"NICK Trogdor\n"); wbuf->len=strlen(wbuf->buf); if(SOCKET_ERROR==WSASend(sock,wbuf,1,&dwBytesRet,dwFlags,NULL,NULL)) //if(SOCKET_ERROR==recv(sock,test,255,0)) { char buf[200]; sprintf(buf,"WSARecv failed. Code %d",WSAGetLastError(),sock); MessageBox(NULL,buf,"Alert!",MB_OK); WSACleanup(); return 0; } sprintf(wbuf->buf,"USER Trogdor 0 * TR\n"); wbuf->len=strlen(wbuf->buf); if(SOCKET_ERROR==WSASend(sock,wbuf,1,&dwBytesRet,dwFlags,NULL,NULL)) //if(SOCKET_ERROR==recv(sock,test,255,0)) { char buf[200]; sprintf(buf,"WSARecv failed. Code %d",WSAGetLastError(),sock); MessageBox(NULL,buf,"Alert!",MB_OK); WSACleanup(); return 0; } fd_set st; st.fd_array[0]=sock; st.fd_count=1; timeval time; time.tv_sec = 2; time.tv_usec = 0; WSAEVENT ev = WSACreateEvent(); int s=0; HANDLE hThread; DWORD dwID = 100; hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)GetData,NULL,0,NULL); while(true) { ZeroMemory(test,sizeof(test)); ZeroMemory(wbuf->buf,sizeof(wbuf->buf)); sprintf(wbuf->buf,"JOIN #pot"); wbuf->len=strlen(wbuf->buf); //sprintf(wbuf->buf,test); //if(SOCKET_ERROR==WSASend(sock,wbuf,1,&dwBytesRet,dwFlags,NULL,NULL)) if(SOCKET_ERROR==send(sock,wbuf->buf,wbuf->len,0)) { char buf[200]; sprintf(buf,"WSARecv failed. Code %d",WSAGetLastError(),sock); MessageBox(NULL,buf,"Alert!",MB_OK); WSACleanup(); return 0; } MBOX(wbuf->buf,"!"); } WSACleanup(); return 0; }
-
Es funktioniert doch.
Bei sprintf(wbuf->buf,"JOIN #pot"); fehlt noch das Zeilenende, also \n.
Jede manuelle Eingabe mit cin oder scanf() schlug fehl, da diese den String
"JOIN #Channel" in zwei Strings geteilt haben.
Gibt es weitere Befehle, mit denen man einen String eingeben kann?
-
Ich habs über gets() und strcat() gelöst.